项目中使用到了上传类,那么如何异步多文件上传呢?
这里考虑到了使用webUploader来做,怎么使用呢,现在看看代码:
API:http://fex.baidu.com/webuploader/doc/index.html#WebUploader_Uploader_getFiles
以上可以打开查看帮助文档:
好了,那么看看代码中是如何使用的:
<link href="__ADMIN__/lib/webuploader/0.1.5/webuploader.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="__ADMIN__/lib/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="__ADMIN__/lib/webuploader/0.1.5/webuploader.min.js"></script>
首先引入上面的两个文件和jquery,然后编写html文件
<div class="uploader-list-container"> <div class="queueList"> <div id="dndArea" class="placeholder"> <div id="filePicker-2"></div> <p>或将文件拖到这里,单次最多可选300文件</p> </div> </div> <div class="statusBar" style="display:none;"> <div class="progress"> <span class="text">0%</span> <span class="percentage"></span> </div> <div class="info"></div> <div class="btns"> <div id="filePicker2"></div> <div class="uploadBtn">开始上传</div> </div> </div> </div>
JS代码:
var uploader = WebUploader.create({ swf: '__ADMIN__/lib/webuploader/0.1.5/Uploader.swf', // 开起分片上传。 chunked: true, //绑定到的按钮 pick: { id: '#filePicker-2', label: '点击选择文件' }, //每次上传都带有一个参数 formData: { uid: 123 }, // 自动上传。 auto: true, // 文件接收服务端。 server: '/doUpload.do', // [默认值:'file'] 设置文件上传域的name。 fileVal:'file', dnd: '#dndArea', //拖拽的区域,如果不指定,则不启动 });
通过上面的几个步骤,就已经可以看到效果了,如图:
好的,看到效果了,那么我把一些API的参数也放在下面,方便填写使用:
指定Drag And Drop拖拽的容器,如果不指定,则不启动。
是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。
指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为
document.body
.指定选择文件的按钮容器,不指定则不创建按钮。
id
{Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。注意 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。label
{String} 请采用innerHTML
代替innerHTML
{String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。multiple
{Boolean} 是否开起同时选择多个文件能力。指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
title
{String} 文字描述extensions
{String} 允许的文件后缀,不带点,多个用逗号分割。mimeTypes
{String} 多个用逗号分割。
设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
可以将此值设置成
flash
,来强制使用 flash 运行时。是否允许在文件传输时提前把下一个文件准备好。 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 如果能提前在当前文件传输期处理,可以节省总体耗时。
是否要分片处理大文件上传。
如果要分片,分多大一片? 默认大小为5M.
如果某个分片由于网络问题出错,允许自动重传多少次?
上传并发数。允许同时最大上传进程数。
文件上传请求的参数表,每次发送都会发送此对象中的参数。
设置文件上传域的name。
文件上传方式,
POST
或者GET
。是否已二进制的流的方式发送文件,这样整个上传内容
php://input
都为文件内容, 其他参数在$_GET数组中。验证文件总数量, 超出则不允许加入队列。
验证文件总大小是否超出限制, 超出则不允许加入队列。
验证单个文件大小是否超出限制, 超出则不允许加入队列。
去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
事件说明
看看常用的触发事件就可以了
事件名 | 参数说明 | 描述 |
---|---|---|
dndAccept |
| 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。 |
beforeFileQueued |
| 当文件被加入队列之前触发,此事件的handler返回值为 |
fileQueued |
| 当文件被加入队列以后触发。 |
filesQueued |
| 当一批文件添加进队列以后触发。 |
fileDequeued |
| 当文件被移除队列后触发。 |
reset | 当 uploader 被重置的时候触发。 | |
startUpload | 当开始上传流程时触发。 | |
stopUpload | 当开始上传流程暂停时触发。 | |
uploadFinished | 当所有文件上传结束时触发。 | |
uploadStart |
| 某个文件开始上传前触发,一个文件只会触发一次。 |
uploadBeforeSend |
| 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。 |
uploadAccept |
| 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为 |
uploadProgress |
| 上传过程中触发,携带上传进度。 |
uploadError |
| 当文件上传出错时触发。 |
uploadSuccess |
| 当文件上传成功时触发。 |
uploadComplete |
| 不管成功或者失败,文件上传完成时触发。 |
error |
| 当validate不通过时,会以派送错误事件的形式通知调用者。通过
|
另外还有一个 all 监听:
//开始上传 $(".uploadBtn").on('click', function() { if ( $(this).hasClass( 'disabled' ) ) { return false; } //判断是否选择了一个目录 如果是 则上传,否则提醒用户进行选择 if ( state === 'ready' ) { uploader.upload(); } else if ( state === 'paused' ) { uploader.upload(); } else if ( state === 'uploading' ) { uploader.stop(); } }); //监听all 凡是触发的函数,这里都会走这个监听。 uploader.on( 'all', function( type ) { var stats; switch( type ) { case 'uploadFinished': setState( 'confirm' ); break; case 'startUpload': setState( 'uploading' ); break; case 'stopUpload': setState( 'paused' ); break; } });
这类参数的使用,主要集中在几个重要的方法上,那么我们来看看,用到了哪些?
var fileName=file.name; //当前文件的名称
fileSize=file.size; //每个文件的大小总和
WebUploader.formatSize(fileSize) //得到做文件的大小
uploader.upload() //开始上传
uploader.stop() //停止
else if ( state === 'confirm' ) {
stats = uploader.getStats();
if ( stats.uploadFailNum ) {
text = '已成功上传' + stats.successNum+ '个文件,'+
stats.uploadFailNum + '文件上传失败,<a class="retry" href="#">重新上传</a>失败文件或<a class="ignore" href="#">忽略</a>'
}
}else{
stats = uploader.getStats();
text = '共' + fileCount + '个文件(' +
WebUploader.formatSize( fileSize ) +
'),已上传' + stats.successNum + '个文件';
if ( stats.uploadFailNum ) {
text += ',失败' + stats.uploadFailNum + '个文件';
}
}
uploader.addButton({
id:"#filePicker2",
label:"继续添加"
});
来点干货:
发送表单数据到服务器:
带有header头的方式请求
var uploader = WebUploader.create({ swf: static_url + '/lib/webuploader/0.1.5/Uploader.swf', // 开起分片上传。 chunked: true, //绑定到的按钮 pick: { id: '#filePicker-2', label: '点击选择文件' }, //上传到服务的值 formData: { 'upType': 'thumb' }, multiple: true, //可以选择多个文件 // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传! resize: false, // 自动上传。 auto: false, isRealTimeDelete:false, // 文件接收服务端。 server: apihost + uploadPath, // [默认值:'file'] 设置文件上传域的name。 fileVal: 'uploadFile', accept: { //title: 'Images', extensions: 'gif,jpg,jpeg,bmp,png', mimeTypes: 'image/*' }, server: root +'file/uploadPic', // 上传文件接口 deleteServer:'', // 删除文件接口 md5Server:'', // md5秒传验证接口 isRealTimeDelete:false, // 删除已上传的文件,是否需要实时删除,true则需要提供删除文件接口 duplicate :true, //去重, 根据文件名字、文件大小和最后修改时间来生成hash Key. dnd: '#dndArea' //拖拽的区域,如果不指定,则不启动 }); /** * 请求之前 封装headers信息 */ uploader.on('uploadBeforeSend', function (obj, data, headers) { jQuery.extend(headers, { "X-Access-Token": projectCommon.getToken(), "Env": projectCommon.config.env, "X-Requested-With": 'xmlhttprequest' }); }); //当某个文件上传成功后,触发的一个事件 uploader.on("uploadSuccess", function (file, response) { //var fileInfo=object.file; // console.log(file); // console.log(response); if (!isUndefined(response.result.id)) { $('.filelist #' + response.result.id).attr('alt', response.result.path); } //alert(object.message+"-------"+object.source_filename); }); // 当文件被加入队列之前触发,此事件的handler返回值为false,则此文件不会被添加进入队列。 uploader.on( 'beforeFileQueued', function( file ) { // 限制图片数量 img_length = $("#thelist img").length; if (img_length >= 6) { layer.msg("图片最多上传6张"); return false; } }); // 文件上传失败,显示上传出错。 uploader.on( 'uploadError', function( file ) { var $li = $( '#'+file.id ), $error = $li.find('div.error'); // 避免重复创建 if ( !$error.length ) { $error = $('<div class="error"></div>').appendTo( $li ); } $error.html('<font color="red">上传失败</font>'); });
帮助文档
http://fex.baidu.com/webuploader/doc/#WebUploader_File
https://www.cnblogs.com/wisdo/p/6159761.html