1.实现将文件拖放到页面元素上
2.在JavaScript中分析被拖放的文件
3.在客户端上加载和解析文件
4.使用XMLHttpRequest2将文件异步上传到服务器
5.上传时,显示图形进度条
6.使用进程增强( progressive enhancement)以确保文件上传表单在所有浏览器正常工作
7.纯JavaScript代码,不使用其它库。
咻,开始吧!
糟糕的浏览器支持
在开始之前说明一下,这个教程使用了一些HTML5的最新技术,可能以后会被修正。目前代码可以正常工作,但是很可能随着API的变化或者浏览器升级而受到影响。
§Firefox和Chrome的最新版本支持所有的功能并且可以完美运行。
§Opera可以用JavaScript解析文件,但未实现拖放文件和XMLHttpRequest2上传。
§IE浏览器和桌面版本的Safari不支持所有的API。
§苹果已禁用Safari浏览器的iPhone和iPad版本的HTML文件上传表单。有谁知道为什么吗?
最后,请注意我的代码只是演示了基本概念,几乎没有错误检查,因此需要进行修改以适应你的工作需要。
HTML和CSS
这是我们的带有文件输入类型的标准表单。唯一的HTML5特性是“multiple”属性,它允许用户选择任意数量的文件。
我们将上传文件到运行PHP的服务器上,但是无论你在服务器端使用什么技术,代码是大致相同的。隐藏的MAX_FILE_SIZE值指定为300,000个字节,这是PHP使用的,但我们还会在浏览器端用它进行检查,以防止大文件上传。
#filedrag元素将被用作接收拖放文件的位置。元素是通过CSS隐藏的,但如果浏览器支持拖拽的话,它会在JavaScript中被显示:
我们还定义了一个.hover类,当用户拖动文件到相应区域元素时,改变元素的显示风格。浏览器不支持在那种情况下的:hover风格,但当事件触发时,我们可以用JavaScript添加类。
文件 *** 作API
W3C 文件 *** 作API
提供了一些对象,我们使用了:
§FileList:代表选定的文件数组。
§File:代表一个单独的文件。
§FileReader:支持JavaScript的客户端读取文件数据的接口。
Javascript事件
是时候处理JavaScript代码了。我们不使用任何JavaScript库,为了节省时间,我们将创建一个辅助函数返回元素的ID和输出状态消息:
我们将在Init()函数里检查文件 *** 作API是否有效:
Init()函数说明:
1.给文件输入元素设置一个“change”事件监听器。
2.显示#filedrag元素。
3.设置“dragover”和“dragleave”事件监听器,以改变的#filedrag元素的风格。
4.给#filedrag元素设置一个“drop”的事件监听器。
5.隐藏表单的提交按钮 - 它不是必需的,因为当文件被选中时我们将进行分析和上传,而不是提交表单。
或者,当浏览器支持文件拖动时,你可以隐藏文件输入元素。就个人而言,我更愿意同时提供两种选择,因为拖放实际上会带来实用性的问题。
XMLHttpRequest.upload方法检查防止在Opera中的问题。浏览器支持File,FileList和FileReader,但不支持拖放事件或XMLHttpRequest2。因此,它可以显示文件信息,但我们不希望显示#filedrag的元素或删除submit按钮。
改变文件拖放风格
很少人在浏览器中进行过文件拖放。事实上,经验丰富的网络用户也不太考虑是否可行。因此,我们使用了标有“drop files here”的元素。当文件拖到#filedrag上时,我们还通过改变元素的风格来进行显示。
分析放下或被选中的文件
无论是使用“Browse”按钮来选中一个或多个文件,或者将文件拖放到拖#filedrag的位置上,我们使用的的相同FileSelectHandler()函数来进行处理:
函数说明:
1.调用FileDragHover()删除hover风格和取消浏览器的事件。这是必不可少的,否则浏览器可能会尝试显示该文件。
2.获取一个FileList对象,无论是从文件输入框(e.target.files)或#filedrag元素(例如dataTransfer.files)。
3.最后,函数遍历FileList的所有File对象,并把它作为一个参数传递给ParseFile()函数...
该函数输出的信息是File对象提供的三个主要的只读属性:
§.name: 文件名 (不包含文件路径)。
§.type: MIME类型, 例如 image/jpeg,text/plain等等。
§.size: 文件大小(字节).
结合HTML5,
<form enctype="multipart/form-data"><input id="file" name="file" type="file" />
<input type="button" value="Upload" />
</form>
<progress></progress> $('#file').change(function(){
var formData = new FormData($('form')[0])
$.ajax({
url: 'upload.php',//接收页面
type: 'POST',
xhr: function() { //XHR事件
myXhr = $.ajaxSettings.xhr()
if(myXhr.upload){ //检测是否有此方法属性
myXhr.upload.addEventListener('progress',progressHandlingFunction, false) // 设置进度
}
return myXhr
},
//Ajax事件
beforeSend: beforeSendHandler,
success: completeHandler,
error: errorHandler,
// Form数据
data: formData,
cache: false,
contentType: false,
processData: false
})
})
主要思路就是将文件切分,然后分块上传。html5 里面有读取文件分割文件的类库,所以才可以支持断点上传,所以这个只能在html5 支持的浏览器上面展示。
同时,在js 和 java 同时使用 cr32 进行文件块的校验,保证数据上传正确。
代码在使用了最新的servlet 3.0 的api,使用了异步执行,监听等方法。
http://www.open-open.com/lib/view/1420970480875
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)