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 相关文章推荐
javascript 当前日期加(天、周、月、年)
Aug 09 Javascript
js中将具有数字属性名的对象转换为数组
Mar 06 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
May 04 Javascript
JQuery菜单效果的两个实例讲解(3)
Sep 17 Javascript
微信小程序 wxapp导航 navigator详解
Oct 31 Javascript
基于slideout.js实现移动端侧边栏滑动特效
Nov 28 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
Mar 03 Javascript
vue.js实现的绑定class操作示例
Jul 06 Javascript
vue2过滤器模糊查询方法
Sep 16 Javascript
使用Vue实现调用接口加载页面初始数据
Oct 28 Javascript
js实现漂亮的星空背景
Nov 01 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
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
斜45度寻路实现函数
2009/08/20 Javascript
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
农田水利实习自我鉴定
2013/09/19 职场文书
工地标语大全
2014/06/18 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
会议通知
2015/04/15 职场文书
部门2015年度工作总结
2015/04/29 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书