`
lingyun246
  • 浏览: 38354 次
  • 来自: 北京
社区版块
存档分类
最新评论

html5 File API实现带有进度提示的文件上传

    博客分类:
  • html
阅读更多
转:
Html5终于解决了上传文件的同时显示文件上传进度的老问题。现在大部分的网站用Flash去实现这一功能,还有一些网站继续采用Html <form>with enctype=multipart/form-data,但是需要修改服务器端可用才能显示给用户文件上传的进度。本质上你需要做的工作是在服务器端接收一个文件时,你发送给它一个字节流,所以你需要知道你已经接收到多少字节并以某种方式传达这些信息给客户端浏览器,在这个过程一直在不断的进行文件的上传。这种方式运行的非常好,不像Flash上传那这样充满了问题(特别是处理大文件上传的时候),然而这种方法是相当复杂的并且听起来不容易理解,因为你本质上是接管了整个服务器端的处理(获取字节流的时候)同时包括了在服务器端实现multipart/form-data协议,伴随一系列的其他事情。

使用Html5 上传文件
XMLHttpRequest 在Html5 规范中已经有全新的变化,规定了XMLHttpRequest Level 2规范(目前最新版本)包含下列新的特性:

处理字节流,例如作为上传或者下载的File,Blob,FormData对象
上传或者下载中的进度事件
跨站点请求
允许创建匿名请求
可以设置请求超时
在这篇文章中我们将能够更清楚的看到#1和#2两个特性。通常,上传文件用XMLHttpRequest并且提供上传进度信息给最终的用户,需要注意的是这种方式解决了不需要服务器端做任何改变,至少是目前处理multipart/form-data协议。所以服务器端的处理逻辑保留不变,这使得开发者适应这种技术相当容易。

enter image description here 图1:文件上传画面-准备上传 enter image description here 图2:显示上传完成画面

注意:上面的图片中,信息提示区域是提供给用户的:

当前选中文件的信息
文件名
文件大小
文件类型
上传完成多少的百分比进度条
上传速度或者上传带宽
距离上传完成大概还有多长时间
已上传文件大小
服务器端的响应
上面第6项或许看起来不重要,但事实上是相当重要的。因为我们用XMLHttpRequest,上传发生在后台,页面没有发生跳转等任何变化,所以对于你用它处理其他一些事情来说是一个非常好的特性。

Html5 Progress Event
对于Html5 Progress Events规范,Html5 Progess Events提供了下列与本次讨论相关的信息

total - 总的字节数
loaded - 到目前为止上传的字节数
lengthComputable - 可计算的已上传字节
请注意到我们需要用两个信息去计算要显示给用户的其他所有信息。要计算出来其他的信息通过上面我们得到信息是相当容易的,但是那需要一些额外的代码并且创建一个定时器。

Html5 Progress Event 应该是什么
考虑到有一部分人想更好的提供给用户所有的信息,所以Html5 Progress Event应该更好的满足需要,因为它给浏览器供应商提供这些额外信息是相当简单的,所以建议progress event应该修改成如下:

total - 总的字节数
loaded - 到目前为止上传的字节数
lengthComputable - 可计算的已上传字节
transferSpeed long类型
timeRemaining JavaScript 日期对象
Html5 上传 用XMLHttpRequest
浏览器支持情况

支持这一特性的浏览器最低版本

Firefox 4.0 beta 6
Chrome 6
Safari 5.02
IE 9 Beta and Opera 10.62 不支持这一特性

简单的示例
下面是一个完整的Html页面包含了实现文件上传并带有进度提示的JavaScript代码,只是实现了基本的功能,感兴趣的可以自己做扩展。 需要吧上传接口修改成自己服务的。


<!DOCTYPE html>
<html>
<head>
    <title>Upload Files using XMLHttpRequest - Minimal</title>
    <script type="text/javascript">
      function fileSelected() {
        var file = document.getElementById('fileToUpload').files[0];
        if (file) {
          var fileSize = 0;
          if (file.size > 1024 * 1024)
            fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
          else
            fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
          document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
          document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
          document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
        }
      }
      function uploadFile() {
        var fd = new FormData();
        fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener("progress", uploadProgress, false);
        xhr.addEventListener("load", uploadComplete, false);
        xhr.addEventListener("error", uploadFailed, false);
        xhr.addEventListener("abort", uploadCanceled, false);
        xhr.open("POST", "upload.do");//修改成自己的接口
        xhr.send(fd);
      }
      function uploadProgress(evt) {
        if (evt.lengthComputable) {
          var percentComplete = Math.round(evt.loaded * 100 / evt.total);
          document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
        }
        else {
          document.getElementById('progressNumber').innerHTML = 'unable to compute';
        }
      }
      function uploadComplete(evt) {
        /* 服务器端返回响应时候触发event事件*/
        alert(evt.target.responseText);
      }
      function uploadFailed(evt) {
        alert("There was an error attempting to upload the file.");
      }
      function uploadCanceled(evt) {
        alert("The upload has been canceled by the user or the browser dropped the connection.");
      }
    </script>
</head>
<body>
  <form id="form1" enctype="multipart/form-data" method="post" action="Upload.aspx">
    <div class="row">
      <label for="fileToUpload">Select a File to Upload</label><br />
      <input type="file" name="fileToUpload" id="fileToUpload" onchange="fileSelected();"/>
    </div>
    <div id="fileName"></div>
    <div id="fileSize"></div>
    <div id="fileType"></div>
    <div class="row">
      <input type="button" onclick="uploadFile()" value="Upload" />
    </div>
    <div id="progressNumber"></div>
  </form>
</body>
</html>

原网站地址:http://my.oschina.net/u/1377774/blog/284703?fromerr=wd2TtzAP
分享到:
评论

相关推荐

    html5带进度多文件大文件上传插件

    本文将详细解析"html5带进度多文件大文件上传插件"的相关知识点,以及如何利用js插件实现这一功能。 1. HTML5 File API:HTML5引入了File API,它为Web应用提供了读取、写入和操作文件的能力。File API允许用户选择...

    android带进度的文件上传

    在Android开发中,实现带有进度显示的文件上传是一项常见的需求,尤其在移动应用中,用户通常希望看到上传过程的实时进度以获得更好的交互体验。本文将深入探讨如何在Android平台上实现这种功能,主要关注以下几个...

    大文件上传带进度

    6. **HTML5 File API**:随着Flash的衰落,HTML5的File API成为主流的文件操作接口,它提供了读取、处理和上传文件的能力,而且支持大文件上传和进度监控。开发者现在通常会用JavaScript结合HTML5 File API来实现大...

    上传文件(图片缩略图上传带进度显示)

    总的来说,实现"上传文件(图片缩略图上传带进度显示)"这一功能需要对前端技术有深入理解,包括文件操作、进度事件处理、Canvas绘图以及安全策略。通过合理的技术选型和精心设计的用户界面,可以大大提高用户在上传...

    带有上传进度无组件上传代码

    总之,"带有上传进度无组件上传代码" 是一种高级的前端开发技术,它结合了HTML5的多种API,提供了一种无需传统文件输入组件的上传方式,并且能够显示上传进度,提升用户体验。对于想要在网页应用中实现高效、用户...

    Jq实现带进度条的多文件上传

    在本文中,我们将深入探讨如何使用jQuery(简称为jq)库来实现一个带有进度条的多文件上传功能。这个功能不仅提供了自动和手动上传的选择,还具有文件列表展示、文件类型与大小判断以及清除功能,使得文件上传变得...

    带进度和多文件上传,基于ssm

    综上所述,这个基于SSM的项目提供了一个完整的、支持多文件上传并带有进度显示的解决方案,适合开发者学习和参考,尤其是那些希望掌握文件上传功能实现的Java Web开发者。通过深入研究和理解这个项目,可以进一步...

    vue文件上传带进度展示

    在Vue.js框架中实现文件上传并附带进度展示是一项常见的需求,这有助于提供更好的用户体验,让用户了解文件上传的实时状态。下面将详细讲解如何在Vue项目中实现这一功能。 首先,我们需要理解Vue的核心概念,如组件...

    文件上传插件带上传进度-WebUploader

    WebUploader是一款功能强大的文件上传插件,尤其适合在Web应用中实现大文件的分块上传以及实时的上传进度显示。这款插件具有优秀的用户体验设计,能够处理多文件选择、预览、断点续传等功能,使得文件上传变得更加...

    带进度条大文件上传源码(单文件多文件都可以传)

    - **HTML5 File API**:HTML5的File API允许开发者在浏览器端处理文件,包括读取、选择和上传文件。它提供了`FileReader`、`FileList`、`File`等对象,使得在JavaScript中操作文件成为可能。 - **FormData对象**:...

    GooUploader多文件同时上传并带有进度条

    在实现上,GooUploader可能基于JavaScript(可能是ES6以上版本)和HTML5的File API,利用Ajax技术与服务器进行通信,通过Web Workers处理复杂的计算任务以避免阻塞主线程。同时,为了兼容旧版浏览器,可能还涉及到...

    swfupload实现带有进度条的文件上传

    在本文中,我们将深入探讨如何利用SwfUpload与jsp、Java Servlet相结合,实现一个带有进度条的文件上传功能。 首先,SwfUpload的工作原理是利用Flash的异步通信能力,它在后台与服务器进行数据交换,用户可以通过...

    带有进度条的文件上传示例

    在ASP.NET中,实现带有进度条的文件上传功能是一项实用且增强用户体验的技术。这主要涉及到JavaScript、HTML5的File API以及服务器端的处理。在这个示例中,我们将深入探讨如何利用这些技术来创建一个实时反馈文件...

    layui文件上传带进度条显示.zip

    本资源"layui文件上传带进度条显示.zip"结合了`layui`与`PHP`,实现了文件上传过程中带有进度条的交互效果,提升了用户体验。 首先,我们要理解`layui`的文件上传组件是如何工作的。`layui`的上传组件基于HTML5的`...

    多文件上传 源码

    这个源码可能提供了一种实现方式,允许用户同时上传多个文件,并且带有进度条显示,用户可以随时停止或删除正在上传的文件。这样的功能提高了用户体验,因为它允许用户批量处理文件,而无需逐一操作。 在实现多文件...

    文件带进度上传下载SQL服务器

    在这个场景中,我们关注的是如何实现带有进度显示的文件上传和下载功能,并将这些文件存入SQL Server数据库的`image`类型字段中。`image`字段类型在SQL Server中用于存储二进制大数据,如图片、文档或任何其他非文本...

    js实现文件上传进度条

    `box`类定义了一个带有圆角的灰色背景,`clip`类用于创建红色的进度条,通过修改`clip`属性来改变进度条的宽度,从而反映出上传进度。 ```html &lt;div id="progressspan" class="clip"&gt;&lt;/div&gt; ``` 2. **本地文件...

    带进度条的文件上传,附带显示上传文件的列表,并且能删除已上传文件.rar

    带进度条的文件上传意味着用户可以看到文件上传的实时进度,这有助于提高用户体验,因为用户可以知道上传何时完成,避免了对上传状态的不确定性。同时,显示上传文件的列表让用户能够看到他们已经上传的文件,方便...

    struts2(ssh)带进度条文件上传 demo 的jar包1

    2. **前端进度监控**:HTML5的File API提供了`progress`事件,可以监听到文件上传的进度。通过计算已上传的字节数与总字节数的比例,更新进度条的状态。 3. **后端处理**:在Struts2的动作类(Action)中,定义一个...

    VB API 实现FTP上传下载源代码

    在VB(Visual Basic)环境中,我们可以使用API(Application Programming Interface)来实现FTP的功能,如文件的上传和下载。API是操作系统提供的一组函数,允许开发者直接与操作系统交互,执行特定任务。在VB中,...

Global site tag (gtag.js) - Google Analytics