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 String 对象
Apr 25 Javascript
JavaScript 学习笔记(十一)
Jan 19 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
Jul 22 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
jQuery简单自定义图片轮播插件及用法示例
Nov 21 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
Dec 02 Javascript
jquery加载单文件vue组件的方法
Jun 20 jQuery
在 vue-cli v3.0 中使用 SCSS/SASS的方法
Jun 14 Javascript
layui表单提交到后台自动封装到实体类的方法
Sep 12 Javascript
JavaScript回调函数callback用法解析
Jan 14 Javascript
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
TS 类型收窄教程示例详解
Sep 23 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 HTML代码串截取代码
2008/12/29 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
javascript函数中的arguments参数
2010/08/01 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python计算字符宽度的方法
2016/06/14 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
创建无烟单位实施方案
2014/03/29 职场文书
施工安全责任书
2014/04/14 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
2014年内勤工作总结
2014/11/24 职场文书
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android