特性一览
- md5(用于秒传)
 - 分片上传
 - html5-runtime,flash-runtime
 - 多种收集器Collector(DndCollector、PasteCollector、PickerCollector)
 - 拥抱es6
 
import {UploadCore, Events, Status, VERSION} from 'uploadcore';
console.log('UploadCore version %s', VERSION);
const up = new UploadCore({
    name: 'file',
    url: 'http://test.yanbingbing.com/upload.php'
});
up.on(Events.FILE_UPLOAD_COMPLETED, (file) => {
	if (file.getStatus() === Status.SUCCESS) {
		alert('上传成功');
		console.info(file.response.getJson());
	} else {
		alert('上传失败');
	}
});
const picker = up.getPickerCollector();
picker.addArea(document.getElementById('clickarea'));完全的功能仅在最新的Chrome浏览器中支持,对于不支持的浏览器,在保证上传功能可用的情况下,采用不支持或降低处理。
特性支持一览
| Feature | Chrome | Firefox | Safari | Edage | IE11 | IE10 | IE9- | 
|---|---|---|---|---|---|---|---|
| 基本上传 | html5 | html5 | html5 | html5 | html5 | html5 | flash | 
| 复制系统文件上传 | 支持 | 
不支持 | 
有问题 | 
不支持 | 
不支持 | 
不支持 | 
不支持 | 
| 复制网页图像上传 | 支持 | 
不支持 | 
不支持 | 
支持 | 
不支持 | 
不支持 | 
不支持 | 
| 截图上传 | 支持 | 
不支持 | 
不支持 | 
支持 | 
部分支持 | 
不支持 | 
不支持 | 
| 拖拽上传 | 目录和文件 | 
文件 | 
文件 | 
不支持 | 
文件 | 
文件 | 
不支持 | 
| 秒传 | 支持 | 
支持 | 
支持 | 
支持 | 
支持 | 
支持 | 
不支持 | 
| 分片上传 | 支持 | 
支持 | 
支持 | 
支持 | 
支持 | 
支持 | 
不支持 | 
如果要保证能在所有浏览器中运行,我们需要引入es5-shim相关ployfill脚本。
<script src="/path/to/es-shim.min.js"></script>
<script src="/path/to/es-sham.min.js"></script>options = {
    // 上传文件字段名称
    name: 'file',
    // 上传目标
    url: 'http://demo.com/rest/1.0/file',
    // 上传文件额外参数
    params: {},
    // 上传文件额外头, `flash下不支持`
    headers: [],
    // 上传文件是否自动附带cookie等信息, `flash下不支持`
    withCredentials: false,
    // 上传超时
    timeout: 0,
    // 是否允许分片上传, `flash下不支持`
    chunkEnable: false,
    // 文件分片大小, 默认单位b,0不分片
    chunkSize: 0,
    // 文件分片上传重试次数
    chunkRetries: 0,
    // 分片上传并发数
    chunkProcessThreads: 2
    
    // 文件上传并发数
    processThreads: 2,
    // 是否选择后自动等待上传
    autoPending: true,
    // 队列容量,0无限
    queueCapcity: 0,
    // 是否多选
    multiple: true,
    // 允许文件类型
    accept: null,
    // 文件大小限制
    fileSizeLimit: 0,
    // 是否防止文件重复
    preventDuplicate: false,
    // 过滤器
    filters:[]
}options.params
上传文件额外参数,支持俩种赋值方式
// 赋值一(Object)
params = {
    foo: 'bar'
}
// 赋值二(Array)
params = [
    {name:'foo', value:'bar'}
]options.headers
上传文件请求头,格式如下:
headers = [
    {name:'X-Requested-With', value:'XMLHttpRequest'}
]options.chunkSize
文件分片大小,默认单位byte,默认0,小于256K时,不可分片。
允许b,k,m,g,t为单位(大小写不敏感)结尾的string或者int。
size = 1; // 1字节
size = '1b'; // 1字节
size = '1k'; // 1千字节 = 1024b
size = '1m'; // 1兆字节 = 1024k
size = '1g'; // 1吉字节 = 1024m
size = '1t'; // 1太字节 = 1024goptions.fileSizeLimit
文件大小限制,默认单位byte,默认0,表示不限制,格式同options.chunkSize。
options.accept
允许文件格式,推荐赋值方式如下:
accept = {
	title: '图片',
	extensions: 'jpg,jpeg,png,gif,webp,bmp'
};如果你觉的有必要,也可以设置一下mimeTypes
accept = {
	title: '图片',
	extensions: 'jpg,jpeg,png,gif,webp,bmp',
	mimeTypes: 'image/*' // or 'image/jpeg,image/png'
};mimetypes设置后在不同浏览器中会表现不一致,谨慎使用
如果觉得不需要那么麻烦,accept也可以更简单
accept = 'jpg,jpeg,png,gif,webp,bmp';
甚至可以
accept = 'images';
accept = 'audios';
accept = 'videos';
accept = ['images', 'videos'];
images,audios,videos为内置类型,定义如下:
images = {
    title: 'Images',
    extensions: 'jpg,jpeg,gif,png,bmp,svg,tiff,tif,ico,jpe,svgz,pct,psp,ai,psd,raw,webp'
};
audios = {
    title: 'Audios',
    extensions: 'aac,aif,flac,iff,m4a,m4b,mid,midi,mp3,mpa,mpc,oga,ogg,ra,ram,snd,wav,wma'
};
videos = {
    title: 'Videos',
    extensions: 'avi,divx,flv,m4v,mkv,mov,mp4,mpeg,mpg,ogm,ogv,ogx,rm,rmvb,smil,webm,wmv,xvid'
};静态变量,获得版本号。
修改已经初始化后的 Options,目前支持
['name', 'url', 'params', 'action', 'data', 'headers', 
'withCredentials', 'timeout', 'chunkEnable', 'chunkSize', 
'chunkRetries', 'chunkProcessThreads', 'autoPending', 
'auto', 'capcity', 'queueCapcity', 'sizeLimit', 
'fileSizeLimit']| 参数 | 类型 | 描述 | 
|---|---|---|
| options | object | 
传入参数,同初始化 | 
添加约束。
| 参数 | 类型 | 描述 | 
|---|---|---|
| constraint | function | 
约束函数 | 
constraint函数如下:
constraint = function () {
    return true;
}constraint函数返回true时表示受到限制,否则不,函数闭包中this指向当前UploadCore。
运行通过UploadCore.addConstraint添加的约束,判断是否限制了添加更多的文件。
返回 bool,true表示受到约束。
添加文件过滤函数。
| 参数 | 类型 | 描述 | 
|---|---|---|
| filter | function | 
过滤函数 | 
filter函数如下:
filter = function () {
   return 'error string';
}filter函数返回error时,文件会被过滤,否则不;有几种方式返回error:
返回字符串
return 'error string';
返回Error
return new Error('some error');
抛出异常
throw new Error('some error');
是否多选。
返回 bool,true表示多选。
获得允许文件类型。
返回
[
    {
        title: 'Images',
        extensions: ['jpg','jpeg','png','gif','bmp','webp'],
        mimeTypes: 'image/*'
    },
    ....
]判断队列是否已满。
判断队列是否为空。
获得文件统计。
返回 Stat
同Stat.getTotal。
同Stat.getFiles。
同Stat.stat。
设置flashpicker的url地址,用于不支持h5上传的浏览器。
| 参数 | 类型 | 描述 | 
|---|---|---|
| url | string | 
flashpicker的url地址 | 
获得PickerCollector单列。
获得DndCollector单列。
获得PasteCollector单列。
添加事件监听。
| 参数 | 类型 | 描述 | 
|---|---|---|
| event | string | 
事件名称 | 
| fn | function | 
事件处理函数 | 
队列事件
| 名称 | 触发对象 | 参数 | 描述 | 
|---|---|---|---|
QUEUE_UPLOAD_START | 
UploadCore | 
无 | 队列上传开始 | 
QUEUE_UPLOAD_END | 
UploadCore | 
无 | 队列上传结束 | 
QUEUE_FILE_ADDED | 
UploadCore | 
File | 
队列添加了一个文件 | 
QUEUE_FILE_FILTERED | 
UploadCore | 
File, Error | 
队列过滤了一个文件 | 
QUEUE_ERROR | 
UploadCore | 
Error | 
队列错误 | 
QUEUE_STAT_CHANGE | 
UploadCore | 
Stat | 
文件统计发生变化 | 
正在进行时事件
| 名称 | 触发对象 | 参数 | 描述 | 
|---|---|---|---|
FILE_UPLOAD_PREPARING | 
UploadCore | 
FileRequest | 
文件上传准备时 | 
CHUNK_UPLOAD_PREPARING | 
UploadCore | 
ChunkRequest | 
分块上传准备时 | 
CHUNK_UPLOAD_COMPLETING | 
UploadCore | 
ChunkResponse | 
分块上传结束时 | 
FILE_UPLOAD_COMPLETING | 
UploadCore | 
FileResponse | 
文件上传结束时 | 
正在进行时事件可以理解为普通事件的增强版,支持Promise返回值,注册的事件监听严格按照顺序执行。
up.on(Events.FILE_UPLOAD_PREPARING, (request) => {
    return new Promise((resolve) => {
        jQuery.getJSON('http://test.yanbingbing.com/token.php').done((token) => {
            request.setParam('token', token);
            resolve();
        });
    });
}).on(Events.FILE_UPLOAD_PREPARING, (request) => {
    console.info(request.getParam('token'));
});文件事件
文件事件同时在UploadCore与File上触发,当在UploadCore上触发时,函数第一参数均为File。
| 名称 | 触发对象 | 参数 | 描述 | 
|---|---|---|---|
FILE_UPLOAD_START | 
UploadCore, File | 
[File] | 
文件上传开始 | 
FILE_UPLOAD_PREPARED | 
UploadCore, File | 
[File], FileRequest | 
文件上传准备好了 | 
FILE_UPLOAD_PROGRESS | 
UploadCore, File | 
[File], Progress | 
文件上传进度中 | 
FILE_UPLOAD_END | 
UploadCore, File | 
[File] | 
文件上传结束 | 
FILE_UPLOAD_SUCCESS | 
UploadCore, File | 
[File], FileResponse | 
文件上传成功 | 
FILE_UPLOAD_ERROR | 
UploadCore, File | 
[File], Error | 
文件上传失败 | 
FILE_UPLOAD_COMPLETED | 
UploadCore, File | 
[File], Status | 
文件上传完成了 | 
FILE_CANCEL | 
UploadCore, File | 
[File] | 
文件退出 | 
FILE_STATUS_CHANGE | 
UploadCore, File | 
[File], Status | 
文件状态发生变化 | 
我们定义了以下错误,方便错误发生时分辨。
AbortError中断错误- name: AbortError
 - message: (message)
 
TimeoutError超时错误- name: TimeoutError
 - message: (message)
 
NetworkError网络错误- status: http status
 - name: NetworkError
 - message: (message)
 
QueueLimitError队列限制错误- name: QueueLimitError
 - message: queue limit
 
FilterError过滤错误- file: 
File - name: FilterError
 - message: (message)
 
- file: 
 DuplicateError文件重复错误,继承自FilterError- file: 
File - name: DuplicateError
 - message: (message)
 
- file: 
 FileExtensionError文件扩展名错误,继承自FilterError- file: 
File - name: FileExtensionError
 - message: (message)
 
- file: 
 FileSizeError文件大小错误,继承自FilterError- file: 
File - name: FileSizeError
 - message: (message)
 
- file: 
 
文件在上传过程中经历的状态值。
| 名称 | 值 | 描述 | 
|---|---|---|
| ALL | 255 | 所有状态 | 
| PROCESS | 31 | 包含状态 INITED 至 END | 
| INITED | 1 | 初始状态 | 
| QUEUED | 2 | 进入队列 | 
| PENDING | 4 | 队列中等待 | 
| PROGRESS | 8 | 上传中 | 
| END | 16 | 上传完成, 等待后续处理 | 
| SUCCESS | 32 | 上传成功 | 
| ERROR | 64 | 上传出错 | 
| CANCELLED | 128 | 上传取消 和 QUEUED 相反, 退出队列 | 
以下为更详细的抽象,均在运行时创建,不对外暴露。
创建一个input[type=file]或者flash拾取器,当浏览器支持DataTransfer&FileList特性时,会优先使用input,拾取器会覆盖在触发区域上方,点击弹出系统对话框以选择文件。
初始化
const picker = up.getPickerCollector();在不支持Html5上传时,需要预先提供flashpicker.swf的url地址。
UploadCore.setSWF(url);添加触发区域
const area = picker.addArea(document.getElementById('upload-button'));我们再添加一个触发区域,或者更多。
const area2 = picker.addArea(document.getElementById('upload-button2'));返回的结果area是一个Emitter,在flash环境下会响应鼠标悬停(rollOver)、鼠标移出(rollOut)事件。
area.on('rollOver', () => {
}).on('rollOut', () => {
});当这个添加的area不需要时,可以销毁。
area.destroy()拖放上传支持。
初始化
const dnd = up.getDndCollector();添加响应区域
const area = dnd.addArea(document.getElementById('droparea'));返回的结果area是一个Emitter,响应开始拖拽(start), 响应拖拽(response), 拖拽结束(end)事件。
area.on('start', (e) => {
}).on('response', (e) => {
   // 返回false值表示:拖拽的项目没有匹配或者未拖进响应区域
   return false;
}).on('end', (e) => {
});当这个添加的area不需要时,可以销毁。
area.destroy()粘贴拾取器支持。
初始化
const paster = up.getPasterCollector();添加响应区域
const area = paster.addArea($('textarea')[0]);返回的结果area是一个Emitter,响应粘贴(paste)事件。
area.on('paste', (clipboardData) => {
});当这个添加的area不需要时,可以销毁。
area.destroy()队列文件的统计。
获得参与统计的文件个数。
| 参数 | 类型 | 描述 | 
|---|---|---|
| flag | Status | 
状态mask | 
获得状态为flag的文件集合。flag支持Status位操作:
flag = Status.ALL ^ Status.CANCELLED;
flag = Status.SUCCESS | Status.ERROR;flag为null相当于Status.ALL
返回
[File, File, ...]| 参数 | 类型 | 描述 | 
|---|---|---|
| flag | Status | 
状态mask | 
统计状态为flag的文件数目;flag赋值同上,例如:
stat(Status.SUCCESS | Status.ERROR)返回
{
    32: 2,
    64: 1,
    sum: 3
}
id(string)
文件唯一id。
name(string)
文件名称。对于从粘贴进来的文件资源,有些情况没有文件名,取用id.ext作为文件名。
ext(string)
文件扩展名。eg. jpg。
type(string)
文件mimetypes类型。 eg. image/jpg。
lastModified(int)
文件最后修改时间,精确到毫秒。eg. 1432866554681。
size(int)
文件大小,单位byte。eg. 1024。
progress(Progress)
文件上传进度。
获取UploadCore。
判断是否是图像文件。mimetype为image/jpg, image/jpeg, image/gif, image/png, image/bmp其中一种,即为图像。
获取当前文件状态,参见Status。
获取当前文件状态标识。
获取源文件资源。
| 参数 | 类型 | 描述 | 
|---|---|---|
| timeout | int | 
超时时间 | 
异步获取文件dataurl内容,返回jQuery-Promise。
异步计算文件MD5值,返回jQuery-Promise。
获取一个文件上传的会话,返回一个jQuery-Promise,让我们除了可以绑定事件外,还可以用session方式来绑定相关动作。
file.session().done(function (response) {
   // 上传成功了
}).fail(function (error) {
   // 上传失败了
}).progress(function (e) {
   // 上传进度中
});为了某些场景的设计,session方式不需要、也不支持解除绑定,等当次上传会话结束后,会自动失效当前session-promise。
如果你绑定的操作需要解除绑定或者不希望会失效,请考虑使用绑定事件方式。
| 参数 | 类型 | 描述 | 
|---|---|---|
| response | ChunkResponse or * | 
用于构造FileResponse的原始数据 | 
结束并完成上传会话,这个函数大多数由内部调用,其它情况如秒传时会直接调用。
让文件等待上传,一般用于手动上传、错误重传。
| 参数 | 类型 | 描述 | 
|---|---|---|
| silent | bool | 
静默行为,为 true 时不触发相应的事件 | 
结束上传会话,退出文件上传队列。
添加事件监听。
| 参数 | 类型 | 描述 | 
|---|---|---|
| event | string | 
事件名称 | 
| fn | function | 
事件处理函数 | 
文件上传进度对象。
total(int)
上传时总大小,上传时这个值总是大于size,因为包含一些请求头信息、formData数据。
loaded(int)
已经上传的数据大小。
percentage(int)
已经上传的百分比0-100。
文件上传请求参数控制,上传时由内部基于options.request创建,作为事件FILE_UPLOAD_PREPARING的唯一参数。
获得请求中的文件对象File。
返回 File
设置上传文件的字段名称,服务端用此字段接收文件。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
上传文件的字段名称 | 
获取上传文件的字段名称。
返回 string
设置上传服务器端响应url。
| 参数 | 类型 | 描述 | 
|---|---|---|
| url | string | 
服务器端响应地址 | 
获得上传服务器端响应。
返回 string
获得参数Params。
返回 Params
获得字段为name的参数集合,同Params。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
字段名称 | 
返回
[
	{name:'name', value:'value1'},
	{name:'name', value:'value2'},
	...
]设置参数值,同Params。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
字段名称 | 
| value | * | 
字段值 | 
获取文件上传时附带的请求头信息。
返回
[
	{name:'header1', value:'value1'},
	{name:'header2', value:'value2'},
	...
]设置一个附带请求头信息。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
字段名称 | 
| value | * | 
字段值 | 
设置是否上传时附带cookie等验证信息。
| 参数 | 类型 | 描述 | 
|---|---|---|
| flag | bool | 
开关 | 
是否上传时附带cookie等验证信息。
返回 bool
设置上传超时时间。
| 参数 | 类型 | 描述 | 
|---|---|---|
| timeout | int | 
超时时间,单位ms | 
获取上传超时时间。
返回 int,上传超时时间,单位ms。
设置分片大小。
| 参数 | 类型 | 描述 | 
|---|---|---|
| size | string or int | 
分片大小,单位byte,格式见options.chunkSize | 
获取分片大小。
返回 int,分片大小,单位byte。
设置分片上传网络出错重试次数。
| 参数 | 类型 | 描述 | 
|---|---|---|
| retries | int | 
重试次数 | 
获取分片上传网络出错重试次数。
返回 int,重试次数。
设置是否开启分片上传。
| 参数 | 类型 | 描述 | 
|---|---|---|
| flag | bool | 
开关 | 
判断是否分片上传,需要同时满足开启了分片上传、分片大小大于256K及文件大小大于分片大小三个条件。
返回 bool
设置分片上传并发数,一个文件分为多块上传时,同时上传的数量。
| 参数 | 类型 | 描述 | 
|---|---|---|
| threads | int | 
并发数 | 
获取分片上传并发数。
返回 int,并发数。
文件上传完成时由内部创建,作为事件FILE_UPLOAD_COMPLETING的唯一参数。
获得FileRequest。
返回 FileRequest
判断是否由多个分片上传完成后响应的数据并实例化而来;正常的分片上传,我们会把最后完成的分片响应数据ChunkResponse作为FileResponse的原始响应数据;以下俩种情况此返回值为否:
- 无论是否使用多个分片上传时,秒传完成-即直接调用
complete(response)方式; - 文件过小、或者未开启分片上传,上传过程没有多个分片。
 
获得原生响应数据。
返回 ChunkResponse | string | null
尝试返回JSON格式的响应数据。
返回 JSON | null
获得响应数据。
返回 string | *
设置响应数据,一般为JSON数据。
| 参数 | 类型 | 描述 | 
|---|---|---|
| response | JSON or * | 
响应数据 | 
文件分片上传时由内部FileRequest派生创建,大多数能获取的数值采用改变时从FileRequest复制方式来使用,作为事件CHUNK_UPLOAD_PREPARING的唯一参数。
获取FileRequest。
返回 FileRequest
获取切片对象。
返回 Blob
获得切片索引。
返回 int,切片索引,从0开始。
是否是多分片上传。
返回 bool
获得请求中的文件对象File,同FileRequest.getFile。
获取上传文件的字段名称,同FileRequest.getName。
设置上传服务器端响应地址,同FileRequest.setUrl。
获得上传服务器端响应地址,同FileRequest.getUrl。
获得参数,同FileRequest.getParams。
获得字段为name的参数集合,同FileRequest.getParam。
设置参数值,同FileRequest.setParam。
获取文件上传时附带的请求头信息,同FileRequest.getHeaders。
设置一个附带请求头信息,同FileRequest.setHeaders。
是否上传时附带cookie等验证信息,同FileRequest.isWithCredentials。
获取上传超时,同FileRequest.getTimeout。
文件分片上传完成时由内部创建,作为事件CHUNK_UPLOAD_COMPLETING的唯一参数。
获取ChunkRequest。
返回 ChunkRequest
获得原生响应数据。
返回 string | null
获得响应数据。
返回 string | *
尝试返回JSON格式的响应数据。
返回 JSON | null
设置响应数据,一般为JSON数据。
| 参数 | 类型 | 描述 | 
|---|---|---|
| response | JSON or * | 
响应数据 | 
用于发送的Form Data数据维护,内部由FileRequest基于options.params创建。
添加参数值。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
字段名称 | 
| value | * | 
字段值 | 
删除键名为name的所有值设置。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
字段名称 | 
获得字段name的值设置,single为true返回单个值,否则以数组形式返回多个。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
字段名称 | 
| single | bool 可选 | 
是否返回单个值 | 
返回
// 多值
[
	{name:'name', value:'value1'},
	{name:'name', value:'value2'},
	...
]
// 单个值
'value1'设置参数值,删除键名为name的所有值设置,新添加一个值为value的设置。
| 参数 | 类型 | 描述 | 
|---|---|---|
| name | string | 
字段名称 | 
| value | * | 
字段值 | 
基于当前实例创建新Params。
返回 Params
以Array格式导出数据。
返回
params = [
  {name: 'foo', value: 'bar'},
  {name: 'foo', value: 'bar1'}
]以querystring格式返回。
返回
foo=bar&foo=bar1