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中的私有/静态属性介绍
Jul 26 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
Jan 05 Javascript
基于javascript实现图片左右切换效果
Jan 25 Javascript
Bootstrap每天必学之日期控制
Mar 07 Javascript
jQuery实现的网格线绘制方法
Jun 20 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
Sep 05 Javascript
bootstrap table操作技巧分享
Feb 15 Javascript
Vue精简版风格指南(推荐)
Jan 30 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
详解webpack打包后如何调试的方法步骤
Nov 07 Javascript
js实现多图和单图上传显示
Dec 18 Javascript
vue点击按钮实现简单页面的切换
Sep 08 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 pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
apache mysql php 源码编译使用方法
2012/05/03 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
Sql面试题
2013/03/20 面试题
医学专业应届生的自我评价
2014/02/28 职场文书
市场营销专业自荐书
2014/06/10 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
英语教师求职信范文
2015/03/20 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
英文投诉信格式
2015/07/03 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript