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读取cookies)
Jan 11 Javascript
JScript分割字符串示例代码
Sep 04 Javascript
详解jquery uploadify 上传文件
Nov 09 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
Nov 14 Javascript
jquery获取复选框被选中的值
Mar 22 Javascript
JavaScript框架(iframe)操作总结
Apr 16 Javascript
提升jQuery的性能需要做好七件事
Jan 11 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
May 03 Javascript
BootStrap 弹出层代码
Feb 09 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
May 26 jQuery
Vue获取微博授权URL代码实例
Nov 04 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
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生成制作验证码代码详解(推荐)
2016/06/12 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
小程序实现搜索框
2020/06/19 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
python实现数组插入新元素的方法
2015/05/22 Python
python 内置函数filter
2017/06/01 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python判断两个对象相等的原理
2017/12/12 Python
python生成九宫格图片
2018/11/19 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
PyQt5实现简易电子词典
2019/06/25 Python
keras得到每层的系数方式
2020/06/15 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
navabi英国:设计师大码女装
2019/06/25 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
放飞蜻蜓反思
2014/02/05 职场文书
空乘英文求职信
2014/04/13 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
2015年党总支工作总结
2015/05/25 职场文书
从事会计工作年限证明
2015/06/23 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL