今天分享给大家一个项目中大文件断点续传功能.大文件切割分片上传. 个人感觉这个功能还不错,具有参考价值,现在把源码分享给大家,有需要的朋友可以参考.功能截图如下
首先要让服务器支持大文件上传,设置如下
upload_max_filesize = 2M //PHP最大能接受的文件大小
post_max_size = 8M //PHP能收到的最大POST值'
memory_limit = 128M //内存上限
max_execution_time = 30 //最大执行时间
思路如下1.建立上传文件夹
2.把文件从上传临时目录移动到上传文件夹
3.所有的文件块上传完成后,进行文件合成
4.删除文件夹
5.返回上传后的文件路径
前端ji部分
var userInfo = {userId:"kazaff", md5:"",truePath:'',categoryId:''};
var chunkSize = 5 * 1024* 1024;//分块大小 上线时候调成5M
var uniqueFileName = null; //文件唯一标识符
var md5Mark = null;
var backEndUrl = "{:U('Admin/FileManage/beforeUpload')}";
WebUploader.Uploader.register({
"before-send-file": "beforeSendFile",
"before-send": "beforeSend",
"after-send-file": "afterSendFile"
}, {
beforeSendFile: function(file){
//秒传验证
var task = new $.Deferred();
var start = new Date().getTime();
(new WebUploader.Uploader()).md5File(file, 0, 10*1024*1024).progress(function(percentage){
console.log(percentage);
}).then(function(val){
console.log("总耗时: "+((new Date().getTime()) - start)/1000);
md5Mark = val;
userInfo.md5 = val;
$.ajax({
type: "POST",
url: backEndUrl,
data: {
status: "md5Check",
md5: val,
categoryId:$('#categoryid').val()
},
cache: false,
timeout: 1000, //todo 超时的话,只能认为该文件不曾上传过
dataType: "json"
}).then(function(data, textStatus, jqXHR){
if(data.ifExist){ //若存在,这返回失败给WebUploader,表明该文件不需要上传
task.reject();
uploader.skipFile(file);
file.path = data.path;
UploadComlate(file,data);
}else{
task.resolve();
//拿到上传文件的唯一名称,用于断点续传
uniqueFileName = md5(''+userInfo.userId+file.name+file.type+file.lastModifiedDate+file.size);
}
}, function(jqXHR, textStatus, errorThrown){ //任何形式的验证失败,都触发重新上传
task.resolve();
//拿到上传文件的唯一名称,用于断点续传
uniqueFileName = md5(''+userInfo.userId+file.name+file.type+file.lastModifiedDate+file.size);
});
});
return $.when(task);
}, beforeSend: function(block){
//分片验证是否已传过,用于断点续传
var task = new $.Deferred();
$.ajax({
type: "POST",
url: backEndUrl,
data: {
status: "chunkCheck",
name: uniqueFileName,
chunkIndex: block.chunk,
size: block.end - block.start
},
cache: false,
timeout: 1000, //todo 超时的话,只能认为该分片未上传过
dataType: "json"
}).then(function(data, textStatus, jqXHR){
if(data.ifExist){ //若存在,返回失败给WebUploader,表明该分块不需要上传
task.reject();
}else{
task.resolve();
}
}, function(jqXHR, textStatus, errorThrown){ //任何形式的验证失败,都触发重新上传
task.resolve();
});
由于源码有点长此处省略,有需要源码的自己下载.................
php处理大文件部分代码
注: 由于php部分代码处理比较多,就不把代码粘贴出来了.源码包已经整理好,需要的朋友可以自己下载
百度网盘下载链接: https://pan.baidu.com/s/1hsCifvY 密码: i49f