几个上传插件的分析对比
下面是我整理的几个插件的分析对比数据,只选择几项展开说明,仅供参考。
项目 | Uploadify | Plupload2.3.1 | DropZone.js | Fine Uploader5.15.0 |
---|---|---|---|---|
兼容性 | IE 8+ | IE 6+ | IE 10+ | IE 8+ |
多文件 | 支持 | 支持 | 支持 | IE10+ |
图片预览 | 不支持 | 不支持 | 支持 | 支持(IE 10+) |
拖拽上传 | html5版本支持 | 仅html5版支持 chrome21+支持文件夹 |
支持 | 支持(甚至chrome和opera15+中的文件夹) |
大文件 | 分块上传 | 分块上传 | ||
自动上传 | 支持 | 不支持 | 不支持 | 支持 |
进度条 | 有 | 无 | 无 | 可自定义(IE10+) |
功能亮点 | 1、flash和html5两个版本 2、可更改上传的文件名 3、由接口参数和CSS控制外观 4、高度可定制 |
1、自动侦测环境, 多种上传方式,兼容性好。 2、支持自动重试 3、依赖自由 4、图片上传前压缩 5、多文件队列上传 |
1、全面的事件处理选项 2、依赖自由 3、可删除已上传的文件 |
1、自动重传 2、暂停\恢复上传(IE10+) 3、删除已上传文件 4、粘贴上传(chrome,opera15+) 5、无服务器上传 6、提供服务器脚本或自定义 7、使用接口控制外观 |
下载地址 | http://www.uploadify.com/ | http://www.plupload.com/ | http://www.dropzonejs.com/ | https://fineuploader.com/ |
(Uploadify有flash和html5两个版本,flash对IE兼容性较好,IE的7、8、9 不支持html5的File API 和xhr2使用FormData)
相关 API 详解
XMLHttpRequest Level2
- 设置请求的超时时间
1 | var xhr=new XMLHttpRequest(); |
- 接收二进制数据
1 | xhr.responseText='blob'//或ArrayBuffer数组 二进制; |
- 进度
监听progress事件,需要注意的是,上传的progress属于XMLHttpRequest.upload对象,下载的progress属于XMLHttpRequest对象
1 | xhr.upload.onprogress=function(e){ |
终止
方法:abort()
事件:onabort
其它事件(IE9+)
loadstart 当接收到数据的第一个字节时触发
error 发生错误时触发
load 接收到完整数据时触发
loadend 在通信完成或者触发error、abort或load事件后触发
FileList
1 | <input type="file" multiple="multiple"/> //IE10+ 支持multiple属性 |
当没有multiple属性时,FileList的长度为1,需要注意的是FileList对象不能在js中直接访问
File
继承Blob对象的所有属性和方法 所有属性均为只读属性
lastModified 最后的修改时间 时间戳 IE10+
lastModifiedData 不再提倡使用,但是还可以使用
name 文件名 IE11+
size 文件大小 IE11+
type 文件类型
slice(start,end);
FileReader
readyState
EMPTY 0 尚未加载数据。 LOADING 1 数据正在加载。 DONE 2 整个读取请求已经完成。
error 读取文件时发生的错误
result 文件的内容
事件处理程序
(1) loadstart 开始读取时
(2) progress 读取时
(3) abort 中止时
(4) error 发生错误时
(5) load 读取操作成功时
(6) loadend 读取完成(成功或失败)时
方法
(1) readAsDataURL()
(2) readAsText()
(3) readAsArrayBuffer()
(4) abort() 中止读操作
实现部分功能的思路
xhr2新增了formData接口,可以通过js用一些键值对来模拟一系列表单控件。使用FormData的最大优点就是可以异步上传二进制文件,二进制文件一般除文本文件外的图形文件、可执行文件等。设置enctype=”multipart/form-data”,可上传二进制数据,用于表单里有图片上传。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传。
非IE6版本的IE由于安全问题直接设置img的src无法显示本地图片,可以将图片转换为base64编码。
多文件上传
多文件上传源码,后台使用$_FIlES对上传结果遍历,并将这些临时文件移动到保存上传图片的文件夹的操作,在此不做详细说明。
文件分块上传
defmain 前辈的文章PHP搭建大文件切割分块上传功能 提供了一个一个很好的思路。
前端主要是利用html5的File API 的slice方法对文件进行分割,使用 xhr2的FormData对象构造上传数据。
拖放上传
这里使用到了HTMl5 拖放的API DataTransfer对象
(1) DataTransfer.files包含数据传输上可用的所有本地文件的列表。如果拖动操作不涉及拖动文件,则此属性是空列表。
(2) DataTransfer.types 只读 strings提供在dragstart事件中设置的格式的数组。
1 | <input id="mylist" type="file"/> |
图片预览
使用html5的FileReader读取本地文件,包括readAsText(),readAsDataURL(),readAsArrayBuffer()三个方法。
1 | //创建一个FileReader对象 |
进度条
通过监听 xhr.upload.onprogress实现上传进度条效果。1
2
3
4
5
6
7
8
9
10var xhr=new window.XMLHttpRequest();
xhr.upload.onprogress=function(e){
if(e.lengthComputable){
//lengthComputable是一个表示进度信息是否可用的布尔值
//loaded表示已经接收的字节数,total表示根据Content-Length响应头部确定的预期字节数。
var percent=e.loaded/e.total;
console.log(percent);
}
}
压缩上传
读取数据
创建一个image对象,监听他的onload事件
根据压缩比例算出宽高
使用canvas将图片画出来按照此宽高画出来
使用toDataURL读取成base64数据的形式上传(怎样上传)
上传
base64数据的形式是这种形式的:data:image/png;base64,someString….
1 | function dataURItoBlob(dataURI) { |