fe.xiaowu
html5(xhr2)并发上传
require([
'upload/base'
], function (Base) {
var options = {};
new Base(options);
});
上传成功事件,回调参数如:
/**
* @param {Object} res 后端返回数据对象
* @param {Object} file 当前上传文件对象
*/
function (res, file) {};
错误事件(不只是上传错误),回调参数如:
/**
* @param {Object} event 当前错误信息对象
* @param {number} event.status 错误状态,同错误码常量对应
* @param {string} event.msg 错误信息
* @param {Object} file 当前上传文件对象
*/
function (event, file) {};
上传进度事件,回调参数如:
/**
* @param {Object} event ProgressEvent
* @param {Object} file 当前上传文件对象
*/
function (event, file) {};
上传完成事件,不管成功还是失败都会触发,回调参数如:
/**
* @param {Object} data 上传数据
* @param {Array} data.success 上传成功的文件对象数组
* @param {Array} data.error 上传失败的文件对象数组
*/
function (data) {};
添加文件到队列事件,回调参数如:
/**
* @param {Object} file 当前上传文件对象
*/
function (file) {};
销毁后事件
/**
* @param {string} options.action 后端上传接口路径
* @param {HTMLelement|string} options.elem 上传file文本框对象
* @param {Object} options.data 向后端发送的数据(post形式)
* @param {boolean} [options.multiple=false] 是否多文件上传,主要控制文本框的`multiple`属性
* @param {string} [options.extname=jpg,png,jpeg,gif] 上传文件扩展名白名单,*表示全部
* @param {number} [options.size=1024 * 1024 * 5] 上传文件单个文件大小,单位b
* @param {number} [options.limit=2] 上传并发数
* @param {number} [options.filename=image] 上传文件的域名
*/
/**
* 开始上传
*
* @return {Object} this
*/
app.start();
/**
* 销毁
*
* @return {Object} this
*/
app.destroy();
该方法是触发第0个input
元素的click
事件,并会携带额外的数据以方便用来判断触发源。触发input
的click
事件会使浏览器自动弹出上传文件窗口
/**
* 弹出选择文件框
*
* @return {Object} this
*/
app.selectFile();
额外数据如:
var $input = $('<input />');
var app = new Base({
elem: $input
});
$input.on('click', function (event, data) {
// event => 事件对象
// data => {target: 'zui/upload/base'}
});
<input id="test-upload-base-file" type="file" />
<div id="test-upload-base-log"></div>
<button id="test-upload-base-start">开始上传</button>
<script>
require([
'upload/base'
], function (Upload) {
var app = new Upload({
elem: '#test-upload-base-file',
multiple: true
});
var log = function (str) {
$('#test-upload-base-log').append('<p>' + str + '</p>');
};
app.on('queued', function (file) {
log('添加到队列,文件名:' + file.name + ',大小:' + file.size);
});
app.on('success', function (res, file) {
log('上传成功,后端返回:' + JSON.stringify(res) + ',文件名:' + file.name);
});
app.on('complete', function (data) {
log('上传完成,成功' + data.success.length + '个,失败' + data.error.length + '个');
});
app.on('progress', function (event, file) {
log('进度:' + JSON.stringify(event) + ',文件名:' + file.name);
});
app.on('error', function (event, file) {
log('上传失败,错误信息:' + JSON.stringify(event) + ',文件名:' + file.name);
});
$('#test-upload-base-start').on('click', function () {
app.start();
});
});
</script>
<input id="test-upload-base-file-2" type="file" />
<div id="test-upload-base-log-2"></div>
<script>
require([
'upload/base'
], function (Upload) {
var app = new Upload({
elem: '#test-upload-base-file-2',
multiple: true
});
var log = function (str) {
$('#test-upload-base-log-2').append('<p>' + str + '</p>');
};
app.on('queued', function (file) {
log('添加到队列,文件名:' + file.name + ',大小:' + file.size);
this.start();
});
app.on('complete', function (data) {
log('上传完成,成功' + data.success.length + '个,失败' + data.error.length + '个');
});
app.on('error', function (event, file) {
log('上传失败,错误信息:' + JSON.stringify(event) + ',文件名:' + file.name);
});
});
</script>
需要用到 upload/previewImage 模块。
默认让input
元素隐藏,给其他元素绑定点击事件,并解决app.selectFile
方法。
<input id="test-upload-base-file-3" type="file" style="display:none" />
<div id="test-upload-base-log-3"></div>
<button id="test-upload-base-selectFile-4">点我添加文件</button>
<script>
require([
'upload/base',
'upload/previewImage'
], function (Upload, Preview) {
var app = new Upload({
elem: '#test-upload-base-file-3',
multiple: true
});
var log = function (str) {
$('#test-upload-base-log-3').append('<p>' + str + '</p>');
};
app.on('queued', function (file) {
log('添加到队列,文件名:' + file.name + ',大小:' + file.size);
log('<img src="' + Preview.createObjectURL(file) + '" height=100>');
});
$('#test-upload-base-selectFile-4').on('click', function() {
app.selectFile();
});
});
</script>