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之选项卡的简单实现
Feb 28 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
Mar 17 Javascript
JS判断当前页面是否在微信浏览器打开的方法
Dec 08 Javascript
JQuery动态添加Select的Option元素实现方法
Aug 29 Javascript
js继承实现方法详解
Dec 16 Javascript
js querySelector() 使用方法
Dec 21 Javascript
javascript实现复选框全选或反选
Feb 04 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
Sep 28 Javascript
Cocos2d实现刮刮卡效果
Dec 20 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
Selenium执行JavaScript脚本的方法示例
Dec 31 Javascript
Vue过滤器(filter)实现及应用场景详解
Jun 15 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 list()函数的详解
2013/06/05 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
在vue项目中使用sass的配置方法
2018/03/20 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
python实现傅里叶级数展开的实现
2018/07/21 Python
django解决跨域请求的问题
2018/11/11 Python
python设置环境变量的原因和方法
2019/06/24 Python
Python操作qml对象过程详解
2019/09/26 Python
使用python实现画AR模型时序图
2019/11/20 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
应用化学专业职业生涯规划书
2013/12/31 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
个人委托书格式
2014/04/04 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
质检员工作总结2015
2015/04/25 职场文书
联谊会开场白
2015/06/01 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
python析构函数用法及注意事项
2021/06/22 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技