jQuery-file-upload使用方法详解(二)
本片文章是接着上一篇文章继续写的jQuery-file-upload使用方法详解(一)
API详解
初始化
$('#fileupload').fileupload([options]);
初始化的HTML对象,可以是一个包含文件上传表单的容器,也可以是上传表单本身,还可以是一个file input
对象。
数据属性
配置项不仅可以在初始化的时候通过options
传入,还可以通过给初始化的HTML对象设置HTML5的数据属性进行设置:
<input id="fileupload" type="file" name="files[]" multiple
data-url="/path/to/upload/handler.json"
data-sequential-uploads="true"
data-form-data='{"script": "true"}'>
更改配置项
你可以在初始化之后随时进行更改配置项:
$('#fileupload').fileupload(
'option',
'url',
'/path/to/upload/handler.json'
);
$('#fileupload').fileupload(
'option',
{
url: '/path/to/upload/handler.json',
sequentialUploads: true
}
);
如果你没有要设置的值,会把它当做一个getter
一样取出当前的值:
var dropZone = $('#fileupload').fileupload(
'option',
'dropZone'
);
销毁
你可以通过调用destory
方法在元素对象上移除该组件方法:
$('#fileupload').fileupload('destroy');
启用/禁用
你可以通过调用disabled/enabled
来启用或者禁用:
$('#fileupload').fileupload('disable');
$('#fileupload').fileupload('enable');
获得上传进度
$('#fileupload').fileupload('progress');
获得正在上传的任务数量
var activeUploads = $('#fileupload').fileupload('active');
程序化文件上传
通常我们都是使用input
元素或者直接拖拽文件来添加文件,如果浏览器支持XHR文件上传的话,我们还可以使用程序化的方式自动添加文件:
$('#fileupload').fileupload('add', {files: filesList});
注意第二个参数,一定要是一个类数组对象。你还可以改写配置项:
$('#fileupload').fileupload('add', {files: filesList, url: '/path/to/upload/handler.json'});
你还可以直接使用send
方法直接发送文件:
$('#fileupload').fileupload('send', {files: filesList});
send
方法会返回一个jQuery的XHR对象,你可以添加一些回调函数:
var jqXHR = $('#fileupload').fileupload('send', {files: filesList})
.success(function (result, textStatus, jqXHR) {/* ... */})
.error(function (jqXHR, textStatus, errorThrown) {/* ... */})
.complete(function (result, textStatus, jqXHR) {/* ... */});
需要注意的是,send
方法并不会把多个文件分成多个请求发送,如果你有多个文件,如果multipart
选项为true
的话,它会把所有的文件一次性上传,如果为false
的话,它只会上传第一个文件。所以,如果你想要多次上传文件的话,要么多次调用send
方法,要么使用add
方法。
在浏览器不支持XHR文件上传时使用程序化文件上传
如果浏览器不支持XHR文件上传时,你可以使用fileInput
选项来使用程序化文件上传:
$('#some-file-input-field').bind('change', function (e) {
$('#fileupload').fileupload('add', {
fileInput: $(this)
});
});
这种方法实际上使用了iframe
的方式进行上传文件。
回调函数
jQuery-file-upload
提供了多个回调函数,有两种方式可以使用,一种是直接在options
里面使用,一种是用函数监听的方式使用,不过要多加一个fileupload
前缀名:
$('#fileupload').fileupload({
drop: function (e, data) {
},
change: function (e, data) {
}
});
$('#fileupload')
.on('fileuploaddrop', function (e, data) {/* ... */})
.on('fileuploadchange', function (e, data) {/* ... */});
jQuery-file-upload
提供的回调函数一共有如下几种:
$('#fileupload')
.on('fileuploadadd', function (e, data) {/* ... */})
.on('fileuploadsubmit', function (e, data) {/* ... */})
.on('fileuploadsend', function (e, data) {/* ... */})
.on('fileuploaddone', function (e, data) {/* ... */})
.on('fileuploadfail', function (e, data) {/* ... */})
.on('fileuploadalways', function (e, data) {/* ... */})
.on('fileuploadprogress', function (e, data) {/* ... */})
.on('fileuploadprogressall', function (e, data) {/* ... */})
.on('fileuploadstart', function (e) {/* ... */})
.on('fileuploadstop', function (e) {/* ... */})
.on('fileuploadchange', function (e, data) {/* ... */})
.on('fileuploadpaste', function (e, data) {/* ... */})
.on('fileuploaddrop', function (e, data) {/* ... */})
.on('fileuploaddragover', function (e) {/* ... */})
.on('fileuploadchunksend', function (e, data) {/* ... */})
.on('fileuploadchunkdone', function (e, data) {/* ... */})
.on('fileuploadchunkfail', function (e, data) {/* ... */})
.on('fileuploadchunkalways', function (e, data) {/* ... */});
其中add
回调函数最为特殊,因为它返回的data
参数提供了一个submit
方法,可以用来开始上传文件,这个方法返回一个jQuery的XHR对象:
$('#fileupload').fileupload({
add: function (e, data) {
data.submit();
}
$('#fileupload').fileupload({
add: function (e, data) {
var jqXHR = data.submit()
.success(function (result, textStatus, jqXHR) {/* ... */})
.error(function (jqXHR, textStatus, errorThrown) {/* ... */})
.complete(function (result, textStatus, jqXHR) {/* ... */});
}
});
取消上传
调用jQuery的XHR的abort
方法即可取消上传:
var jqXHR = $('#fileupload').fileupload('send', {files: filesList})
.error(function (jqXHR, textStatus, errorThrown) {
if (errorThrown === 'abort') {
alert('File Upload has been canceled');
}
});
$('button.cancel').click(function (e) {
jqXHR.abort();
});
提供一个替代的文件名
上传文件File
的name
属性是只读的,但是你可以通过设置uploadName
为每一个文件提供一个替代的文件名:
$('#fileupload').fileupload({
add: function (e, data) {
var count = data.files.length;
var i;
for (i = 0; i < count; i++) {
data.files[i].uploadName =
Math.floor(Math.random() * 1000) + '_' + data.files[i].name;
}
data.submit();
}
});
通过Ajax获取额外的参数后再开始上传文件
如果你想在使用AJAX从后台获取数据之后,然后再开始上传文件的话,可以通过改写add
或者submit
的回调:
//这种方式会改变上传的默认UI界面
$('#fileupload').fileupload({
add: function (e, data) {
$.getJSON('/example/url', function (result) {
data.formData = result; // e.g. {id: 123}
data.submit();
});
}
});
//这种方式不会改变默认的上传UI界面
$('#fileupload').fileupload({
add: function (e, data) {
var that = this;
$.getJSON('/example/url', function (result) {
data.formData = result; // e.g. {id: 123}
$.blueimp.fileupload.prototype
.options.add.call(that, e, data);
});
}
});
//使用submit
$('#fileupload').fileupload({
submit: function (e, data) {
var $this = $(this);
$.getJSON('/example/url', function (result) {
data.formData = result; // e.g. {id: 123}
data.jqXHR = $this.fileupload('send', data);
});
return false;
}
});
配置项详解
jQuery-file-upload
组件由最基本的脚本jquery.fileupload.js
提供基本的API以及附加的插件提供完整的用户界面jquery.fileupload-ui.js
AJAX配置选项
jQuery-file-upload
组件使用的是jQuery的ajax
方法,就算浏览器不支持XHR也没事,因为使用了iframe tranport
插件。processData
, contentType
,cache
都是默认设置为false
的,不该更改,timeout
默认设置为0。它还有下面这些参数需要设置:
url
上传地址,如果没有设置,则使用表单action
地址,如果也没有则使用当前页面地址。type
上传方式,默认为POST
dataType
后台返回数据类型
通用配置选项
dropZone
拖拽放置文件对象,默认为整个文档,设置为null
或者空对象来禁用拖拽功能pasteZone
粘贴上传文件,默认为整个文档,目前只有chrome
支持fileInput
是file
类型的input
jQuery对象,如果没有定义则为初始化对象内部的file
类型的input
,可以设置为null
或者空来禁用。replaceFileInput
默认为true
,每当file
类型的input
触发change
事件时,都会被它的克隆元素替代,这在iframe
队列上传和再次上传同一个文件时是必需的。paramName
文件form data
的参数名,如果没有设置的话,则使用file
的input
的name
属性名,如果也没有的话,则为files[]
formAcceptCharset
设置iframe
上传时的accept-charset
属性,若没有设置则使用表单的accept-charset
属性值,示例utf-8
singleFileUploads
默认true
,将每个文件都使用一个独立的请求发送,如果想要使用一个请求发送多个文件的话,可以将之设置为false
,并且multipart
选项也要设置为true
。limitMultiFileUploads
限制一个请求中发送多个文件的数量,默认为undefined
,可设置为整数值。当singleFileUploads
为true
或者limitMultiFileUploadSize
被设置时,该选项将被忽略。limitMultiFileUploadSize
限制一个请求上传文件的数量,使的文件大小不超过设定的值,默认为undefined
,可以设置为整数值,当singleFileUploads
为true
时该选项将被忽略。limitMultiFileUploadSizeOverhead
同一个请求中上传多个文件时,含有太多的字节数,因此该选项可以为每个文件增添额外的开销,也就是使文件数*开销大小
加所有文件大小小于limitMultiFileUploadSize
,默认值为512
sequentialUploads
队列上传,默认为false
,也就是可以同时并行上传多个请求。limitConcurrentUploads
限制同时上传请求数,默认为undefined
,可以设置为整数。forceIframeTransport
强制使用iframe
上传,当后台无法设置Access-Control-Allow-Origin
来满足XHR的跨域上传时,这个选项很有用,默认为false
。initialIframeSrc
当时有iframe
进行上传时重写iframe
的src
,默认为javascript:false;
redirect
当时有iframe
进行跨域上传时,服务端上传完成返回需要跳转的地址,然后把上传信息以URL-encoded
形式写在URL参数里。redirectParamName
重定向地址参数名,如果空的话,则为redirect
postMessage
使用postMessage
上传方式时,设置使用postMessage
API页面的地址。multipart
默认为true
,发送请求都是multipart/form-data
的方式,如果设置为false
,将会以流的方式进行发送,并且无法发送额外的form-data
数据。maxChunkSize
默认为undefined
,将大文件进行分片上传,如果该选项设置为0
,undefined
,null
,或者浏览器不支持Blob
API的话,将会整个上传。当在Firefox
小于7的版本使用时,multipart
必须设置为false
,因为Gecko 2.0
添加Blobs时候发送multipart
请求时是一个空的filename
,但是一些后台(PHP ,Django)无法解析空filename
的multipart
请求。 如果启用了改选项,且singleFileUploads
为false
时,只有选择的第一个文件将会被上传。uploadedBytes
默认为undefined
,已经上传的字节数,当使用非multipart
或者分片上传被终止时,可以通过设置该选项来恢复上传,最有用的地方就是在add
或者send
的回调函数里。recalculateProgress
重新计算上传进度,默认为true
,默认的,上传失败或者终止会从总体进度计算中移除,你可以将之设置为false
来防止重新计算进度。