一.使用webuploader插件的原因说明
被现在做的项目坑了。
先说一下我的项目架构spring+struts2+mybatis+MySQL
然后呢。之前说好的按照2G上传就可以了,于是乎,用了ajaxFileUpload插件,因为之前用图片上传也是用这个,所以上传附件的时候就直接拿来用了
各种码代码,测试也测过了,2G文件上传没问题,坑来了,项目上线后,客户又要求上传4G文件,甚至还有20G以上的。。纳尼,你不早说哦。。。
在IE11下用ajaxFileUpload.js插件上传超过4G的文件,IE直接抛出异常了。弹出 算术结果超过32位 的消息.
如下图:
附加说明一下,我的系统是64位,8G内存,google浏览器和IE11浏览器都是32位的。google下用AjaxFileUpload上传8G都问题。都不会报错。
IE11下超过4G直接报上图这个错了。没办法。换插件。
二.插件选择
1.stream上传插件。stream是解决不同浏览器上传文件插件,是Uploadify的flash版和html5的结合。插件地址http://www.twinkling.cn/
功能确实很强大,不过CSS样式固定死了,和我现在项目的进度条样式很不一样。还是放弃了这个插件
2.Webuploader 插件。WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, Android 4+。两套运行时,同样的调用方式,可供用户任意选用。
采用大文件分片并发上传,极大的提高了文件上传效率。插件地址 http://fex.baidu.com/webuploader/
这个插件可以自定义CSS样式啊。功能也很强大,于是乎果断采用这个插件。
三.WebUploader 单文件上传
我用的是Webuploader0.1.5版本的,Webuploader主要是把大文件在客户端进行分片,比如按照每5M进行分片发送请求,后台接收到文件进行合并文件。两种方式合并文件,第一种等所有分片都传到后台,然后在合并,这种要保障分片顺序正确,第二种是边分片边合并。项目里我使用的是第二种。使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF。
1.引入JS文件
2.引入CSS样式
3.引入SWF,SWF不直接引用,在webUploader初始化的时候指定SWF的路径就可以了。
4.upload3.html
DEMO
画面比较简单,长这个样子
5.upload3.js
包含单文件上传,多文件上传,和webuploader多实例
$(function(){
var $list = $("#thelist");
var uploader ;// 实例化
uploader = WebUploader.create({
auto:false, //是否自动上传
pick: {
id: '#attach',
name:"file", //这个地方 name 没什么用,虽然打开调试器,input的名字确实改过来了。但是提交到后台取不到文件。如果想自定义file的name属性,还是要和fileval 配合使用。
label: '点击选择图片',
multiple:false //默认为true,就是可以多选
},
swf: '../../main/js/Uploader.swf',
//fileval:'multiFile', //自定义file的name属性,我用的版本是0.1.5 ,打开客户端调试器发现生成的input 的name 没改过来。
//名字还是默认的file,但不是没用哦。虽然客户端名字没改变,但是提交到到后台,是要用multiFile 这个对象来取文件的,用file 是取不到文件的
// 建议作者有时间把这个地方改改啊,搞死人了。。
server: "ContentsDetail!ajaxAttachUpload.action",
duplicate:true,//是否可重复选择同一文件
resize: false,
formdata: {
"status":"file",
"contentsDto.contentsId":"0000004730",
"uploadNum":"0000004730",
"existFlg":'false'
},
compress: null,//图片不压缩
chunked: true, //分片处理
chunkSize: 5 * 1024 * 1024, //每片5M
chunkRetry:false,//如果失败,则不重试
threads:1,//上传并发数。允许同时最大上传进程数。
// runtimeOrder: 'flash',
// 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。
disableGlobalDnd: true
});
// 当有文件添加进来的时候
uploader.on( "fileQueued", function( file ) {
console.log("fileQueued:");
$list.append( "" +
"" + file.name + "" +
"
等待上传...
" +
"" );
});
//当所有文件上传结束时触发
uploader.on("uploadFinished",function(){
console.log("uploadFinished:");
})
//当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。
uploader.on("uploadAccept",function(object,ret){
//服务器响应了
//ret._raw 类似于 data
var data =JSON.parse(ret._raw);
if(data.resultCode != "1" && data.resultCode != "3"){
if(data.resultCode == "9"){
uploader.reset();
alert("error");
return false;
}
}else{
//E05017
uploader.reset();
alert("error");
return false;
}
})
//当文件上传成功时触发。
uploader.on( "uploadSuccess", function( file ) {
$( "#"+file.id ).find("p.state").text("已上传");
});
uploader.on( "uploadError", function( file ) {
$( "#"+file.id ).find("p.state").text("上传出错");
uploader.cancelFile(file);
uploader.removeFile(file,true);
uploader.reset();
});
$("#upload").on("click", function() {
uploader.upload();
})
});
$(function(){
var $list = $("#thelist1");
var fileSize = 0; //总文件大小
var fileName = []; //文件名列表
var fileSizeoneByOne =[];//每个文件大小
var uploader ;// 实例化
uploader = WebUploader.create({
auto:false, //是否自动上传
pick: {
id: '#multi',
label: '点击选择文件',
name:"multiFile"
},
swf: '../../main/js/Uploader.swf',
server: "ContentsDetail!multiUpload.action",
duplicate:true, //同一文件是否可重复选择
resize: false,
formdata: {
"status":"multi",
"contentsDto.contentsId":"0000004730",
"uploadNum":"0000004730",
"existFlg":'false'
},
compress: null,//图片不压缩
chunked: true, //分片
chunkSize: 5 * 1024 * 1024, //每片5M
chunkRetry:false,//如果失败,则不重试
threads:1,//上传并发数。允许同时最大上传进程数。
//fileNumLimit:50,//验证文件总数量, 超出则不允许加入队列
// runtimeOrder: 'flash',
// 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。
disableGlobalDnd: true
});
// 当有文件添加进来的时候
uploader.on( "fileQueued", function( file ) {
console.log("fileQueued:");
$list.append( "" +
"" + file.name + "" +
"
等待上传...
" +
"" );
});
// 当开始上传流程时触发
uploader.on( "startUpload", function() {
console.log("startUpload");
//添加额外的表单参数
$.extend( true, uploader.options.formData, {"fileSize":fileSize,"multiFileName":fileName.join(","),"fileSizeOneByOne":fileSizeOneByOne.join(",")});
});
//当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。
uploader.on("uploadAccept",function(object,ret){
//服务器响应了
//ret._raw 类似于 data
console.log("uploadAccept");
console.log(ret);
var data =JSON.parse(ret._raw);
if(data.resultCode!="1" && data.resultCode !="3"){
if(data.resultCode == "9"){
alert("error");
uploader.reset();
return;
}
}else{
uploader.reset();
alert("error");
}
})
uploader.on( "uploadSuccess", function( file ) {
$( "#"+file.id ).find("p.state").text("已上传");
});
uploader.on( "uploadError", function( file,reason ) {
$( "#"+file.id ).find("p.state").text("上传出错");
console.log("uploadError");
console.log(file);
console.log(reason);
//多个文件
var fileArray = uploader.getFiles();
for(var i = 0 ;i
6.ContentsDetail.action
//单文件上传后台代码
public void ajaxAttachUpload() {
String path = "d:\test\"+fileFileName;
try {
File file = this.getFile();
FileUtil.randomAccessFile(path, file);
//如果文件小与5M的话,分片参数chunk的值是null
if(StringUtils.isEmpty(chunk)){
outJson("0", "success", "");
}else{
//chunk 分片索引,下标从0开始
//chunks 总分片数
if (Integer.valueOf(chunk) == (Integer.valueOf(chunks) - 1)) {
outJson("0", "上传成功", "");
} else {
outJson("2", "上传中" + fileFileName + " chunk:" + chunk, "");
}
}
} catch (Exception e) {
outJson("3", "上传失败", "");
}
}
FileUtil.java
public static void randomAccessFile( String outPath,File tempFile) throws IOException{
RandomAccessFile raFile = null;
BufferedInputStream inputStream=null;
try{
File dirFile = new File(outPath);
//以读写的方式打开目标文件
raFile = new RandomAccessFile(dirFile, "rw");
raFile.seek(raFile.length());
inputStream = new BufferedInputStream(new FileInputStream(tempFile));
byte[] buf = new byte[1024];
int length = 0;
while ((length = inputStream.read(buf)) != -1) {
raFile.write(buf, 0, length);
}
}catch(Exception e){
throw new IOException(e.getMessage());
}finally{
try {
if (inputStream != null) {
inputStream.close();
}
if (raFile != null) {
raFile.close();
}
}catch(Exception e){
throw new IOException(e.getMessage());
}
}
}
7.效果图
以上所述是小编给大家介绍的Java中使用WebUploader插件上传大文件单文件和多文件的方法小结的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!



