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实现的Ajax 验证用户名是否存在的实现代码
Apr 06 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
JavaScript获取并更改input标签name属性的方法
Jul 02 Javascript
JavaScript的ExtJS框架中表格的编写教程
May 21 Javascript
动态设置form表单的action属性的值的简单方法
May 25 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
Feb 09 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 jQuery
浅谈React Event实现原理
Sep 20 Javascript
微信小程序使用canvas的画图操作示例
Jan 18 Javascript
vue项目中引入Sass实例方法
Aug 27 Javascript
用JS实现一个简单的打砖块游戏
Dec 11 Javascript
jQuery实现开关灯效果
Aug 02 jQuery
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强制下载类型的实现代码
2011/04/21 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python检测生僻字的实现方法
2016/10/23 Python
Django如何实现上传图片功能
2019/08/16 Python
pytorch 模型可视化的例子
2019/08/17 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
利用python汇总统计多张Excel
2020/09/22 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
明信片寄语大全
2014/04/08 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
骨干教师事迹材料
2014/12/17 职场文书
推普标语口号大全
2015/12/26 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android