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 相关文章推荐
json 实例详细说明教程
Oct 31 Javascript
JS中confirm,alert,prompt函数区别分析
Jan 17 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
Jul 27 Javascript
js 链式延迟执行DOME
Jan 04 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
Sep 12 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
Angular4学习教程之DOM属性绑定详解
Jan 04 Javascript
vue中axios解决跨域问题和拦截器的使用方法
Mar 07 Javascript
js实现京东秒杀倒计时功能
Jan 21 Javascript
详解js动态获取浏览器或页面等容器的宽高
Mar 13 Javascript
ligerUI的ligerDialog关闭刷新的方法
Sep 27 Javascript
vue3.0 上手体验
Sep 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
Laravel事件监听器用法实例分析
2019/03/12 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
业务代表的岗位职责
2013/11/16 职场文书
财务出纳岗位职责
2014/02/03 职场文书
装修设计师求职信
2014/02/26 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书
小学班长竞选稿
2015/11/20 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript