JavaScript File分段上传


Posted in Javascript onMarch 10, 2016

HTML

<form method="POST" name="form" action="/mupload/upload/" enctype="multipart/form-data">
<input type='hidden' name='csrfmiddlewaretoken' value='' />
<input id='file' type='file' name='file' onchange="" />
<input id='button' name='submit' type='button' value="上传" onclick="chunk_upload(this)"/>
</form>

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;
}<br>//按大小切割文件段
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){<br> if(end==size){<br> var backtext=xmlhttp.responseText;<br> alert(backtext);<br> }else{<br> alert("上传完成第"+i+"段")<br> start=end;<br> chunk_upload(button);<br> }<br> }else{<br> alert("上传错误");<br> chunk_upload(button);<br> }
}

主要思想:

注意设置切割的起始位置和切割大小,通过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.onchange= 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) {
}
});
Javascript 相关文章推荐
js的event详解。
Sep 06 Javascript
Jquery replace 字符替换实现代码
Dec 02 Javascript
js Map List 遍历使用示例
Jul 10 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
JS判断表单输入是否为空(示例代码)
Dec 23 Javascript
Javascript自定义事件详解
Jan 13 Javascript
jQuery zTree树插件动态加载实例代码
May 11 jQuery
vue.js $refs和$emit 父子组件交互的方法
Dec 20 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
Sep 30 Javascript
JS实现随机生成10个手机号的方法示例
Dec 07 Javascript
微信小程序实现动态列表项的顺序加载动画
Jul 25 Javascript
vue项目初始化到登录login页面的示例
Oct 31 Javascript
ES6中非常实用的新特性介绍
Mar 10 #Javascript
ES6的新特性概览
Mar 10 #Javascript
JavaScript字符串常用的方法
Mar 10 #Javascript
javascript中call apply 与 bind方法详解
Mar 10 #Javascript
angularjs表格ng-table使用备忘录
Mar 09 #Javascript
详解AngularJS控制器的使用
Mar 09 #Javascript
JQuery Mobile实现导航栏和页脚
Mar 09 #Javascript
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php合并js请求的例子
2013/11/01 PHP
PHP数组操作类实例
2015/07/11 PHP
php利用header函数下载各种文件
2016/08/24 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
Python最基本的输入输出详解
2015/04/25 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
优秀志愿者事迹材料
2014/02/03 职场文书
高三高考决心书
2014/03/11 职场文书
升职演讲稿范文
2014/05/23 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
检讨书怎么写?
2019/06/21 职场文书