百度的WebUpLoader控件是比较好用的一款web文件上传控件,只是用法上官网写的并不能让小白们有眼前一亮的感觉,我在项目中用到了,顺便便贴出来给小伙伴们一个参考,如有错误,还请各位不吝赐教,多多指正。
官网API地址:http://fex.baidu.com/webuploader/doc/#WebUploader_Uploader_events
整体代码逻辑思路
1.文件唯一性验证
2.分块上传之前进行分块验证
3.分块上传,后台接收
4.上传完成,进行分块合并
5.取消文件上传处理
前端代码
Web前端需要引用js,swf
1.文件唯一性验证
文件上传前获取文件MD5值,文件断点续传的时候可以确定文件的唯一性,(由于有些文件可能会比较大,可以设置验证大小,缩短验证时间)
/**
* 模块-上传文件核心
*/
define(['jquery', 'webuploader'], function ($, WebUploader) {
return {
//初始化核心上传组件
init: function (config) {
//系统中上传文件的参数()
var getFolderPath = config.getFolderPath;
var getProjectNodeId = config.getProjectNodeId;
var getSourceId = config.getSourceId;
var sourceName = config.sourceName;
var getIsOuter = config.getIsOuter;
var serverUrl = config.serverUrl;
var callback = config.callback;
var uploader;//上传组件对象
//WebUploader插件初始化--------------------------------------------------------
$(document).ready(function () {
//初始化参数
var $ = jQuery,
$list = $('#thelist'),//文件列表
$btn = $('#ctlBtn'),//开始上传按钮
state = 'pending';//分块上传状态
/******************下面的参数是自定义的*************************/
var fileMd5;
var count = 0;//当前正在上传的文件在数组中的下标,一次上传多个文件时使用
var filesArr = new Array();//文件数组:每当有文件被添加进队列的时候 就push到数组中
//重写插件方法
WebUploader.Uploader.register({
"before-send-file": "beforeSendFile",//整个文件上传前
"before-send": "beforeSend", //每个分片上传前
}, {
//时间点1:所有分块进行上传之前调用此函数
beforeSendFile: function (file) {
//创建一个异步对象
var deferred = WebUploader.Deferred();
(new WebUploader.Uploader()).md5File(file, 0, 10 * 1024 * 1024)
.progress(function (percentage) {
$('#' + file.id).find('p.state').text('正在读取文件信息...');
})
.then(function (val) {
$('#' + file.id).find("p.state").text("成功获取文件信息...");
fileMd5 = val
//添加参数---文件路径
uploader.option('formData', {
md5: val
})
//获取文件信息后进入下一步
deferred.resolve();
});
return deferred.promise();
},
//时间点2:如果有分块上传,则每个分块上传之前调用此函数
beforeSend: function (block) {
var deferred = WebUploader.Deferred();
var folderPath = $('.fpath:eq(0)').text()
$.ajax({
type: "POST",
url: "/CRM/FileManage/CheckFileChunk", //ajax验证每一个分片
data: {
folderPath: folderPath + "/" + $('input[name="filetype"]:checked').val(),//区分内外部文件
md5: fileMd5, //文件唯一标记
chunk: block.chunk, //当前分块下标
chunkSize: block.end - block.start//当前分块大小
},
cache: false,
async: false, // 与js同步
timeout: 1000, //todo 超时的话,只能认为该分片未上传过
dataType: "json",
success: function (response) {
if (response.result == 1) {
//分块存在,跳过
deferred.reject();
} else {
//分块不存在或不完整,重新发送该分块内容
deferred.resolve();
}
}
});
this.owner.options.formData.fileMd5 = fileMd5;
deferred.resolve();
return deferred.promise();
}
});
//实例化上传插件--------------------------------------------------------------------------
uploader = WebUploader.create({
auto: false,//选择文件后是否自动上传
swf: '/CommonResource/scripts/Uploader.swf',
server: "/CRM/FileManage/UploadFile",
pick: '#picker',
formData: {
folderPath: '',
md5: '',
projectNodeId: '',
sourceId: ''
},
chunked: true,//开启分片上传
chunkSize: 5 * 1024 * 1024,// 如果要分片,分多大一片?默认大小为5M
chunkRetry: 3,//如果某个分片由于网络问题出错,允许自动重传多少次
prepareNextFile: true,//上传当前分片时预处理下一分片
threads: 3,//上传并发数。允许同时最大上传进程数[默认值:3]
duplicate: false,//是否重复上传(同时选择多个一样的文件),true可以重复上传
fileSizeLimit: 6 * 1024 * 1024 * 1024,//6G 验证文件总大小是否超出限制, 超出则不允许加入队列
fileSingleSizeLimit: 3 * 1024 * 1024 * 1024, //3G 验证单个文件大小是否超出限制, 超出则不允许加入队列
pick: {
id: '#picker', //这个id是你要点击上传文件按钮的外层div的id
multiple: false //是否可以批量上传,true可以同时选择多个文件
},
resize: false,//不压缩image, 默认如果是jpeg,文件上传前会先压缩再上传!
//accept: {
// //允许上传的文件后缀,不带点ÿ