使用js实现分段上传文件,本文使用了FileReader对象,可参考:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

1)获取文件,分段读取

function WebDav_Upload() {
var file = document.getElementById('WebdavFileToUpload').files[0];
if (window.FileReader ){
if(file) {
total_file_size=file.size;
fromSize=ToSize;
ToSize=ToSize+ 4 * 1024;
if(ToSize>file.size){
ToSize=file.size;
} var reader = new FileReader();
var blob;
if(file.webkitSlice) {
blob = file.webkitSlice(fromSize, ToSize);
}else if (file.mozSlice) {
blob = file.mozSlice(fromSize, ToSize );
}else{
blob=file.slice(fromSize,ToSize);
}
reader.onprogress=function(p){
if (p.loaded){
}else {
}
}
reader.onloadend = function(){
if(isBrowser()=='IE'){
WebDav_PutSyncXML_IE11(Path_Name+file.name,file.type,fromSize,ToSize,file.size,reader.result);
}else{
WebDav_PutSyncXML(Path_Name+file.name,file.type,fromSize,ToSize,file.size,reader.result);
}
if (reader.error){
} else {
}
}
if(isBrowser()=='IE'){
reader.readAsArrayBuffer(blob);
}else{
reader.readAsBinaryString(blob);
}
}
}else{
showAlert("lupdateBrowser");
return;
}
}

2)使用ajax 上传文件

function WebDav_PutSyncXML(xmlName,FileType,FileDataFrom,FileDataTo,FileDataTotal,FileData) {
var host = window.location.protocol + "//" + window.location.host ;
var xmlNametemp=xmlName.replace(new RegExp("#","gm"),"%23");
var url = host + "/webdav" + xmlNametemp;
var content;
content=$.ajax( {
type: "PUT",
processData: false,
contentType: false,
xhr: function() {
var xhr = $.ajaxSettings.xhr();
if (!xhr.sendAsBinary) {
xhr.legacySend = xhr.send;
xhr.sendAsBinary = function(string) {
var bytes = Array.prototype.map.call(string, function(c) {
return c.charCodeAt(0) & 0xff;
});
this.legacySend(new Uint8Array(bytes).buffer);
};
}
xhr.send = xhr.sendAsBinary;
return xhr;
},
'beforeSend': function(xhr) {
xhr.setRequestHeader("Authorization",webdav_getAuthHeader("PUT"));
xhr.setRequestHeader("Content-Type", FileType);
if(FileDataFrom!=0) {
xhr.setRequestHeader("Content-Range", "bytes "+FileDataFrom+"-"+FileDataTo+"/"+FileDataTotal);
}
}, url: url,
data: FileData,
async: true,
success:function(data, textStatus) {
WebDav_Upload_Ondoing();
},
complete: function(XMLHttpRequest, textStatus) {
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
}
}).responseXML;
return content; }

3)处理上传进度条

function WebDav_Upload_Ondoing() {
if(Cancel_flag==1){
var cancelfilename=document.getElementById('webdavuploadschedule_FileName').innerHTML; WebDav_Delete(cancelfilename);
fromSize=0;
ToSize=0;
setTimeout("clear_upload_barview_function();",100);
return;
}
if(Pause_flag==1){
return;
}else{
if(ToSize>=total_file_size){
fromSize=0;
ToSize=0;
document.getElementById("bar").style.width = 100 + "%";
document.getElementById("bar").innerHTML = document.getElementById("bar").style.width;
setTimeout("clear_upload_barview_function();",800); $("#mWebDav").objWebDav().onLoad(true);
}else{
var bar_length;
bar_length=Math.floor((ToSize/total_file_size)*100);
document.getElementById("bar").style.width = bar_length + "%";
document.getElementById("bar").innerHTML = document.getElementById("bar").style.width;
WebDav_Upload();
}
}
}

补充:FileReader用法:

FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始缓冲区)的内容,使用File或Blob对象指定要读取的文件或数据

这里File对象可以是来自<input>元素上选择文件后返回的FileList对象:document.getElementById("input").file[0]

  或者使用onchange事件:<input type="file" id='input' onchange='handleFile(this.files)'>

  如果是多个文件,只需要加上一个multiple属性即可:<input type='file' id='input' multiple onchange='handleFile(this.files)'>

也可以来自拖放操作生成的DataTransfer对象,还可以是来自一个HTMLCanvasElement上执行mozGetAsFile()方法后返回的结果。

1)构造函数:reader = FileReader()

2)属性:

  FileReader.error:只读,一个DOMException,表示读取文件时发生的错误

  FileReader.readyState:三个取值

    EMPTY    0  还没有加载任何数据

    LOADING   1  数据正在被加载

    DONE       2  已完成全部的读取请求

  FileReader.result:文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作

3)事件处理:

  FileReader.onabort:处理abort事件。该事件在读取操作被中断时触发

  FileReader.onerror:处理error事件。该事件在读取操作发生错误时触发

  FileReader.onload:处理load事件。该事件在读取完成时触发

  FileReader.onloadstart:处理loadstart事件。该事件在读取开始时触发

  FileReader.onloadend:处理loadend事件。该事件在读取结束时(成功或者失败)触发

  FileReader.onprogress:处理progress事件。该事件在读取Blob时触发

  *****因为FileReader继承自EventTarget,所以这些事件也可以通过addEventListener方法使用*****

4)方法:

  FileReader.abort():中止读取操作。在返回时,readyState为None

  FileReader.readAsArrayBuffer():开始读取指定的Blob中的内容。一旦完成,result属性中保存的将是被读取文件的ArrayBuffer数据对象

  FileReader.readAsDataURL():开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data:URL格式的字符串以表示所读取的内容

  FileReader.readAsText():开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串用于表示所读取的文件内容

https://developer.mozilla.org/zh-CN/docs/Web/API/File/Using_files_from_web_applications

兼容:IE10及以上

js实现分段上传文件的更多相关文章

  1. JS 异步分段上传文件

    为了解决大文件上传 (PHP上传最大限制2GB) 同时为了解决文件上传是对服务器造成的压力 可以通过分段上传解决这个问题,这得益于HTML5开发的file API 前台代码: 引用了进度条插件myPr ...

  2. Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

    目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能---- ...

  3. Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)

    前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次 ...

  4. c#+js 使用formdata上传文件

    如果不是使用form表单submit的形式,我们可以手动通过formdata传值(针对文件上传等) 比如: <html> <head> <meta name=" ...

  5. js拖拽上传 文件上传之拖拽上传

    由于项目需要上传文件到服务器,于是便在文件上传的基础上增加了拖拽上传.拖拽上传当然属于文件上传的一部分,只不过在文件上传的基础上增加了拖拽的界面,主要在于前台的交互, 从拖拽的文件中获取文件列表然后调 ...

  6. js无刷新上传文件

    传统的文件上传方式 <form action="" method="POST" enctype="multipart/form-data&quo ...

  7. JS分段上传文件(File)并使用MD5.js加密文件段用来后台校验

    HTML <form method="POST" name="form1" action="/mupload/upload/" enc ...

  8. jquery.form.js ajax提交上传文件

    项目中最近有用到表单提交,是带有图片上传的表单录入,需要ajax异步提交,网上找了好多例子都是只能提交上传字段一个信息的,这里整理一下.表单里有普通文本信息字段也有图片上传字段. 1.jsp代码--引 ...

  9. js通过formData上传文件,Spring后台处理

    1.前端 var formData = new FormData(); formData.append('file', $("#file").val()); $.ajax({ ur ...

随机推荐

  1. 微信小程序去除Button默认样式

    在小程序开发过程中,使用率蛮高的组件button,因为经常要去除默认样式,然后再自定义样式,所以经常写,自己也总结分享一下简单的实现步骤. (一)实现效果1.实现前(默认样式): 2.实现后(去除默认 ...

  2. Vs 中关于项目中的某 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx”

    问题:     首先出现这个bug的是在我的vs2017社区版的ide上,这两天使用了出现了一个非常神奇的问题,就是我程序中的nuget包总提示找不到源文件,并且我点击Nuget还原的话还一直提示着一 ...

  3. 2019腾讯WXG移动客户端暑期实习面经

    微信这个比较迷,二面完官网流程灰了,但是过了一周多突然来三面,下午面完三面晚上HR面,第三天offer call, 莫名其妙过了 之前以为已经挂了,所以没有写面经,现在距一面已经快一个月了,只能还记得 ...

  4. Oracle AWRSQRPT报告生成和性能分析

    我写的SQL调优专栏:https://blog.csdn.net/u014427391/article/category/8679315 对于局部的,比如某个页面列表sql,我们可以使用Oracle的 ...

  5. springboot打包不同环境配置与shell脚本部署

    本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...

  6. 设计一个可拔插的 IOC 容器

    前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本. 之所以大的版本号变为 2,确实是向下不兼容了:主要表现为: 修复了几个反馈的 bug. 灵活的路由方式. 可拔插 ...

  7. Linux性能评估工具

    目录 介绍 负载:uptime 查看内核的信息: dmesg 查看内存状态: free.vmstat free: 查看内存,已用内存,剩余内存.交换分区等 vmstat:显示虚拟内存状况的信息. 查看 ...

  8. KnockoutJS-模板绑定

    对于knockoutJS来讲,模板绑定和Mapping插件绑定是十分重要的功能,虽然模板绑定在我工作中用的及其少,但模板绑定的重要性不可忽视,在其他前端框架中,如Angular.Vue等等,模板存在的 ...

  9. MySQL在CenterOS和Ubuntu的安装

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glib ...

  10. Deepin MongoDB安装&使用总结

    参考:手把手教你 MongoDB 的安装与详细使用(一) deepin 安装 mongodb 数据库(全面) 1. 导入公钥 sudo apt-key adv --keyserver hkp://ke ...