js php 分段上传文件,JavaScript File分段上传

HTML

js方法

var fileSplitSize = 1024 * 1024;

var start=0,end=0;

var i=0;

// 文件段上传

function chunk_upload(button){

var xmlhttp = new XMLHttpRequest();

xmlhttp.open("POST", "/chunk_upload/upload/", false);

xmlhttp.setRequestHeader("X-CSRFToken", button.form['csrfmiddlewaretoken'].value);

var f = button.form;

var file = f['file']['files'][0];

var size=file.size;

end=start+fileSplitSize;

if(end>size){

i=-1;

end=size;

}else{

i+=1;

end=end;

}
  //按大小切割文件段

var blob = file.slice(start, end);

xmlhttp.setRequestHeader('charset','utf-8');

xmlhttp.setRequestHeader("fileMD5", fileMD5);

xmlhttp.setRequestHeader("start", start);

xmlhttp.setRequestHeader("end", end);

xmlhttp.send(blob);

if(xmlhttp.status==200){
if(end==size){
var backtext=xmlhttp.responseText;
alert(backtext);
}else{
alert("上传完成第"+i+"段")
start=end;
chunk_upload(button);
}
}else{
alert("上传错误");
chunk_upload(button);
}

}

主要思想:

注意设置切割的起始位置和切割大小,通过XMLHttpRequest的发送请求(http协议要知道)。

如果一些标记数据可以添加协议头:xmlhttp.setRequestHeader("end", end);

发送协议体xmlhttp.send(data);

监听返回码来判断是否传递成功,在进行下一步操作。

重新设置切割位置,然后递归调用自身start=end;chunk_upload(button);

注意:

切割的start与end和filesize的关系

纯js异步上传文件,并返回上传进度

纯js实现异步上传文件,异步返回文件上传进度,0.05到0.1秒回调一次上传进度,其它详细见代码片段下用法注释

1. 简单的异步上传函数

;(function(window,document){

var myUpload = function(option) {

var file,

fd = new FormData(),

xhr = new XMLHttpRequest(),

loaded, tot, per, uploadUrl,input;

input = document.createElement("input");

input.setAttribute('id',"myUpload-input");

input.setAttribute('type',"file");

input.setAttribute('name',"files");

input.click();

uploadUrl = option.uploadUrl;

callback = option.callback;

uploading = option.uploading;

beforeSend = option.beforeSend;

input.οnchange= function(){

file = input.files[0];

if(beforeSend instanceof Function){

if(beforeSend(file) === false){

return false;

}

}

fd.append("files", file);

xhr.onreadystatechange = function() {

if (xhr.readyState == 4 && xhr.status == 200) {

if(callback instanceof Function){

callback(xhr.responseText);

}

}

}

//侦查当前附件上传情况

xhr.upload.onprogress = function(evt) {

loaded = evt.loaded;

tot = evt.total;

per = Math.floor(100 * loaded / tot); //已经上传的百分比

if(uploading instanceof Function){

uploading(per);

}

};

xhr.open("post", uploadUrl);

xhr.send(fd);

}

};

window.myUpload = myUpload;

})(window,document);

//用法

//触发文件上传事件

myUpload({

//上传文件接收地址

uploadUrl: "/async/myUpload.php",

//选择文件后,发送文件前自定义事件

//file为上传的文件信息,可在此处做文件检测、初始化进度条等动作

beforeSend: function(file) {

},

//文件上传完成后回调函数

//res为文件上传信息

callback: function(res) {

},

//返回上传过程中包括上传进度的相关信息

//详细请看res,可在此加入进度条相关代码

uploading: function(res) {

}

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值