由于业务需要,需要上传大文件,已有的版本无法处理IE版本,经过调研,百度的 webuploader 支持 IE 浏览器,而且支持计算MD5值,进而可以实现秒传的功能。

大文件上传主要分为三部分,预上传,分块上传,合并上传。

预上传:计算MD5值,同时获取服务器返回的参数,作为分块上传的参数

分块上传:对文件按照固定的大小进行分块,分块后并上传块,其中参数包含预上传计算的MD5值,如果上传的分块已经存在,则跳过执行,如果不存在,则执行分块上传。

合并上传:当所有的分块完成上传后,对文件进行合并上传。

其中,用到beforeSendFile,afterFileSend这两个监听函数,其中,监听函数beforeSendFile,主要是计算MD5值,同时进行预上传,用到defered,是为了等待异步执行的结果。uploadBeforeSend与beforeSendFile对应,uploadBeforeSend主要有以下功能:

默认的上传参数,可以扩展此对象来控制上传参数。

可以扩展此对象来控制上传头部。

当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。

afterFileSend 是完成最终的大文件合并上传。

代码如下:

var fileMd5; //保存文件MD5名称

var uploader; //全局对象uploader

var dfsId;

var uploadId;

var rnd = GC.gRnd();

var uploadShardSize = parent.gMain.isCeph=="1"?5 * 1024 * 1024:4 * 1024 * 1024;

var discussContent = jQuery('#upload_discusscontent');

if (parent.gMain.diskType == 2) {

discussContent.parent().show();

}

WebUploader.Uploader.register({

"before-send-file" : "beforeSendFile", //文件上传之前执行

"before-send" : "beforeSend", //文件块上传之前执行

"after-send-file" : "afterSendFile", //上传完成之后执行

},

{

//时间点1:所有进行上传之前调用此函数

beforeSendFile : function(file) {

console.log(file);

var owner = this.owner

var deferred = WebUploader.Deferred();

// 计算文件的唯一标识,用于断点续传和妙传

(new WebUploader.Uploader()).md5File(file, 0,

10 * 1024 * 1024).progress(

function(percentage) {

jQuery("#" + file.id).find("div.state").text("正在扫描文件") ;

}).then(

function(val) {

fileMd5 = val;

file.fileMd5 = fileMd5

jQuery("#" + file.id).find("div.state").text("成功获取文件信息");

// 放行

var datas = {

//文件唯一标记

fileMd5 : fileMd5,

diskType: parent.gMain.diskType,

appFileId: '',

creatorUsn: parent.gMain.groupUsn,

uploadType: file.chunks == 1 ? 1 : 3,

comeFrom: 11,

parentId: (parent.gMain.currentFid == -2) ? -1 : parent.gMain.currentFid,

fileSize: file.size,

groupId: parent.gMain.groupId,

fileName: file.name,

discussContent: (parent.gMain.diskType == 2) ? discussContent.val() : '',

model: parent.gMain.uploadModel

};

jQuery.ajax({

type : "POST",

url : parent.gConst.ajaxPostUrl.file + "?func=common:upload&sid="+parent.gMain.sid +"&rnd="+rnd,

data: JSON.stringify(datas),

dataType : "json",

success : function(response) {

console.log(response)

if(response && response.code==='DFS_118'){

owner.skipFile( file );

deferred.reject();

jQuery("#" + file.id).find("div.state").text("秒传");

} else {

//分块不存在或不完整,重新发送该分块内容

dfsId = response.var.dfsFileId;

uploadId = response.var.uploadId;

deferred.resolve();

}

},

beforeSend: function (XMLHttpRequest) {

XMLHttpRequest.setRequestHeader("Content-Type", "text/javascript; charset=utf-8");

}

});

});

return deferred.promise();

},

//每一个分块发送之前执行该操作,检查当前块是否已经上传

beforeSend : function(block) {

var deferred = WebUploader.Deferred();

dfsId = dfsId;

deferred.resolve();

this.owner.options.formData = {

fileMd5: fileMd5,

start: block.start

};

return deferred.promise();

},

afterSendFile : function(file) {

// 通知合并分块

console.log(file)

var comepleteData = {

diskType: parent.gMain.diskType,

uploadType: file.blocks ? file.blocks.length == 1 ? 1 : 3 : 1,

creatorUsn: parent.gMain.groupUsn,

parentId: (parent.gMain.currentFid == -2) ? -1 : parent.gMain.currentFid,

fileSize: file.size,

groupId: parent.gMain.groupId,

fileName: file.name,

fileMd5: fileMd5,

comeFrom: 11,

uploadId: uploadId,

dfsFileId: dfsId,

model: parent.gMain.uploadModel,

partCount: file.blocks ? file.blocks.length : 1

}

jQuery.ajax({

type : "POST",

url : parent.gConst.ajaxPostUrl.file+ "?func=common:completeUpload&sid="+parent.gMain.sid,

data: JSON.stringify(comepleteData),

dataType: 'json',

success : function(response) {

var $li = jQuery('#' + file.id);

$li.find('p.state').text('上传完成');

jQuery("#ctlBtn").addClass('disabled');

},

beforeSend: function (XMLHttpRequest) {

XMLHttpRequest.setRequestHeader("Content-Type", "text/javascript; charset=utf-8");

}

});

}

});

uploader = WebUploader.create({

swf: '../resource_drive/js/control/fileupload/Uploader.swf',

server: 'service/common/onestfile.do?func=common:onestUpload&sid=' + parent.gMain.sid,

pick:{

id: '#asd', //这个id是你要点击上传文件按钮的外层div的id

multiple : true //是否可以批量上传,true可以同时选择多个文件

},

auto: true,

disableGlobalDnd: true, //禁用页面拖拽

chunked: true, // 开启分片上传

chunkSize: uploadShardSize, //分片大小

chunkRetry: 3, //重传次数

threads: 1, //同时上传进程

fileSizeLimit: 2000*1024*1024, //验证文件总大小

fileSingleSizeLimit: 2000*1024*1024, //验证单个文件大小

resize: false,

});

//当文件添加进队列

uploader.on("fileQueued", function(file) {

// fileList

jQuery("#divDialogfileupload").show();

jQuery("#sexwarning").css("display","block");

jQuery(".upfile_ul").css("display","block");

jQuery(".upfile_ul").append("

" + file.name +

"

等待上传...

");

});

//文件上传过程中创建进度条

uploader.on("uploadProgress", function(file, progress){

var id = jQuery("#"+file.id);

id.find("span.text").text((progress.toFixed(2))*100+"%")

id.find("div.state").text("上传中...")

if (progress == 1) {

id.find("div.state").text("上传完成")

}

});

//发送前填充数据

uploader.on('uploadBeforeSend', function( block, data ) {

// block为分块数据。

console.log(block);

console.log(data);

var deferred = WebUploader.Deferred();

// file为分块对应的file对象。

var file = block.file;

var fileMd5 = file.fileMd5;

// 修改data可以控制发送哪些携带数据。

// 将存在file对象中的md5数据携带发送过去。

data.appFileId = "";//md5

data.fileMd5 = fileMd5;//md5

data.fileName = data.name;

data.diskType = parent.gMain.diskType;

data.uploadType = block.chunks == 1 ? 1 : 3;

data.creatorUsn = parent.gMain.groupUsn;

data.parentId = (parent.gMain.currentFid == -2) ? -1 : parent.gMain.currentFid;

data.fileSize = data.size;

data.groupId = parent.gMain.groupId;

data.model = parent.gMain.uploadModel;

data.fileRealPath = block.file.source.source.webkitRelativePath;

data.comeFrom = 11;

data.dfsFileId = dfsId;

data.blob = data.name;

if (block.chunks !== 1) {

data.uploadId = uploadId;

data.range = block.start + "-" + block.end;

data.partCount = block.chunks;

data.partNum = block.chunk + 1;

}

data.discussContent = (parent.gMain.diskType == 2) ? discussContent.val() : '';

deferred.resolve();

});

//上传成功

uploader.on("uploadSuccess", function(file) {

var id = jQuery("#"+file.id);

id.find("div.state").text("已上传")

});

//上传失败

uploader.on('uploadError', function( file ) {

var id = jQuery("#"+file.id);

id.find("div.state").text("上传失败")

});

// 上传完成

uploader.on("uploadComplete", function(file) {

var id = jQuery("#"+file.id);

id.find("div.state").text("上传完成")

});

php webuploader大文件,web uploader 上传大文件总结相关推荐

  1. my97显示服务器时间,封装Web Uploader 上传插件、My97DatePicker、百度 编辑器 的使用 (ASP.NET MVC)...

    Web Uploader: WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优 ...

  2. java 图片上传_java web图片上传和文件上传实例

    本篇文章主要介绍了java web图片上传和文件上传实例,具有一定的参考价值,有需要的可以了解一下. 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多 ...

  3. java web文件上传详解_java web图片上传和文件上传实例详解

    java web图片上传和文件上传 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定 ...

  4. ftp服务器批量上传文件,bat批量上传ftp文件到服务器

    bat批量上传ftp文件到服务器 内容精选 换一换 CDM支持周期性自动将新增文件上传到OBS,不需要写代码,也不需要用户频繁手动上传即可使用OBS的海量存储能力进行文件备份.这里以CDM周期性备份F ...

  5. ThinkPhp上传文件提示“没有上传的文件”解决方案

    使用ThinkPhp框架上传小图片文件成功,上传大文件失败. 后来查找了原因,是因为php限制了上传文件的大小,修改php.ini如下配置: upload_max_filesize = 300M po ...

  6. web页面上传大文件有没有好的解决方案

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  7. python selenium下载图片_Python Selenium Web自动化上传/下载文件图文详解

    情景: 在用selenium进行web页面自动化时,时不时会遇到上传附件的情况,常见的情况就是一个上传按钮,点击后弹出windows窗口,选择文件后上传,如下图1所示 图1 这种情况超出了seleni ...

  8. 华为云服务器 大文件,云服务器上传大文件

    云服务器上传大文件 内容精选 换一换 本节操作介绍本地MacOS系统主机通过安装"Microsoft Remote Desktop for Mac"工具向Windows云服务器传输 ...

  9. step-by-step多文件WEB批量上传(swfupload)的完美解决方案

    来源:http://www.cnblogs.com/goody9807/archive/2008/11/04/1326098.html 功能完全支持ie和firefox浏览器! 一般的WEB方式文件上 ...

最新文章

  1. pandas使用shift函数对数数据进行向上偏移(-1)或者向下偏移(1)、索引不移动,移动之后无值的赋值为NaN、将原数据列与偏移后的数据列相加生成新的数据列
  2. 抚摸那条船——彭晓东
  3. 开发使用air还是pro_苹果MacBook全系选购指北,Air和Pro如何选?
  4. .NET中国峰会 参与意愿调查
  5. 第一章-从双向链表学习设计
  6. ios 内存管理的理解(三)ARC下 对象内存管理
  7. 为5—18岁青少年提供营地教育,漫族完成百万级天使轮融资
  8. LeetCode(485)——最大连续1的个数(JavaScript)
  9. linux命令大全(持续更新)
  10. 开发工具Charles for Mac(信息抓取) v4.6.3b1
  11. Cohen-Sutherland算法概述
  12. UNP Chapter 3 - 套接口编程简介
  13. OligoGreen染料|花菁类(Cyanine系列)-引物、Oligo核酸、多肽标记染料
  14. foxmail超大附件服务器文件怎么删,foxmail邮件太大怎么发?foxmail发送超大附件的方法...
  15. 论uni-app中,文本首行缩进两个字符解决方法
  16. 搭建GitHub免费个人网站(详细教程)
  17. 这5款微信小程序,实用又不占内存!
  18. matlab处理数据,提示“提示位置1处的索引超出数组边界。不能超出1”,这该怎么处理呢
  19. 【工程光学】光度学色度学
  20. 【day6】类与对象、封装、构造方法

热门文章

  1. linux编译安装mysql 5.1_linux编译安装mysql5.1.x
  2. Attribute 绑定、类绑定和样式绑定
  3. 《深入理解计算机系统》第七章——链接知识点总结
  4. iOS调用系统相机文字改为中文
  5. iOS 自动布局框架 – Masonry 详解
  6. Apache Tomcat 7.0.93 发布,开源 Java Web 应用服务器
  7. 基于 Webpack 3 的 React 工程项目脚手架
  8. 分享一段Java搞笑的代码注释
  9. maven基础概念学习1
  10. 一款基jquery超炫的动画导航菜单