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 相关文章推荐
Jquery ui css framework
Jun 28 Javascript
jQuery.validate 常用方法及需要注意的问题
Mar 20 Javascript
JavaScript获取网页中第一个图片id的方法
Apr 03 Javascript
javascript实现网页背景烟花效果的方法
Aug 06 Javascript
JavaScript程序中实现继承特性的方式总结
Jun 24 Javascript
js时间比较 js计算时间差的简单实现方法
Aug 26 Javascript
详谈innerHTML innerText的使用和区别
Aug 18 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 Javascript
使用JavaScript实现node.js中的path.join方法
Aug 12 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
Apr 10 jQuery
Vue中对iframe实现keep alive无刷新的方法
Jul 23 Javascript
微信小程序点击view动态添加样式过程解析
Jan 21 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上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
js判断变量是否空值的代码
2008/10/26 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
python判断完全平方数的方法
2018/11/13 Python
django settings.py 配置文件及介绍
2019/07/15 Python
python自动发微信监控报警
2019/09/06 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Python callable内置函数原理解析
2020/03/05 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
实习生评语
2014/04/26 职场文书
小学优秀班主任材料
2014/12/17 职场文书
测量员岗位职责
2015/02/14 职场文书
新郎新娘致辞
2015/07/31 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
python利用while求100内的整数和方式
2021/11/07 Python