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 相关文章推荐
js 在定义的时候立即执行的函数表达式(function)写法
Jan 16 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
Mar 20 Javascript
常用的JavaScript WEB操作方法分享
Feb 28 Javascript
jQuery的文档处理程序详解
May 10 Javascript
Web安全测试之XSS实例讲解
Aug 15 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
Vue.js学习示例分享
Feb 05 Javascript
React Native实现地址挑选器功能
Oct 24 Javascript
浅谈在react中如何实现扫码枪输入
Jul 04 Javascript
Angular Excel 导入与导出的实现代码
Apr 17 Javascript
微信小程序在线客服自动回复功能(基于node)
Jul 03 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
python中的set实现不重复的排序原理
2018/01/24 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
医生自荐信
2013/10/11 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
庐山导游词
2015/02/03 职场文书
实施意见格式范本
2015/06/05 职场文书
功夫熊猫观后感
2015/06/10 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL