程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中應用WebUploader插件上傳年夜文件單文件和多文件的辦法小結

Java中應用WebUploader插件上傳年夜文件單文件和多文件的辦法小結

編輯:關於JAVA

Java中應用WebUploader插件上傳年夜文件單文件和多文件的辦法小結。本站提示廣大學習愛好者:(Java中應用WebUploader插件上傳年夜文件單文件和多文件的辦法小結)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中應用WebUploader插件上傳年夜文件單文件和多文件的辦法小結正文


一.應用webuploader插件的緣由解釋

被如今做的項目坑了。

先說一下我的項目架構spring+struts2+mybatis+MySQL

然後呢。之前說好的依照2G上傳便可以了,因而乎,用了ajaxFileUpload插件,由於之前用圖片上傳也是用這個,所以上傳附件的時刻就直接拿來用了

各類碼代碼,測試也測過了,2G文件上傳沒成績,坑來了,項目上線後,客戶又請求上傳4G文件,乃至還有20G以上的。。納尼,你不早說哦。。。

在IE11下用ajaxFileUpload.js插件上傳跨越4G的文件,IE直接拋出異常了。彈出 算術成果跨越32位 的新聞.
以下圖:

 

附加解釋一下,我的體系是64位,8G內存,谷歌閱讀器和IE11閱讀器都是32位的。谷歌下用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.百度.com/webuploader/
這個插件可以自界說CSS款式啊。功效也很壯大,因而乎武斷采取這個插件。

三.WebUploader 單文件上傳

我用的是Webuploader0.1.5版本的,Webuploader重要是把年夜文件在客戶端停止分片,好比依照每5M停止分片發送要求,後台吸收到文件停止歸並文件。兩種方法歸並文件,第一種等一切分片都傳到後台,然後在歸並,這類要保證分片次序准確,第二種是邊分片邊歸並。項目裡我應用的是第二種。應用Web Uploader文件上傳須要引入三種資本:JS, CSS, SWF。

1.引入JS文件

<script type="text/javascript" src="../main/js/webuploader.js"></script>
<script type="text/javascript" src="../main/js/webuploader.min.js"></script>

2.引入CSS款式

<link href="../main/css/webuploader.css" rel="stylesheet" type="text/css" />

3.引入SWF,SWF不直接援用,在webUploader初始化的時刻指定SWF的途徑便可以了。

4.upload3.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<meta http-equiv="Content-Language" content="ja" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>DEMO</title>
<link href="../main/css/stream-v1.css" rel="stylesheet" type="text/css" />
<link href="../main/css/webuploader.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../main/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="../main/js/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="../main/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="../main/js/bootstrap-datepicker.min.js"></script>
<script type="text/javascript" src="../main/js/locales/bootstrap-datepicker.ja.min.js"></script>
<script type="text/javascript" src="../main/js/webuploader.js"></script>
<script type="text/javascript" src="../main/js/webuploader.min.js"></script>
<script type="text/javascript" src="../js/contents/upload3.js"></script>
</head>
<body>
<div id="uploader" class="wu-example">
<!--用來寄存文件信息-->
<div id="thelist" class="uploader-list"></div>
<div class="btns">
<div id="attach"></div>
<input type="button" value="上傳" id="upload"/> 
</div>
</div>
<div id="uploader1" class="wu-example">
<!--用來寄存文件信息-->
<div id="thelist1" class="uploader-list"></div>
<div class="btns">
<div id="multi"></div>
<input type="button" value="上傳" id="multiUpload"/> 
</div>
</div>
</body>
</html>

畫面比擬簡略,長這個模樣

 

5.upload3.js

包括單文件上傳,多文件上傳,和webuploader多實例

/*********************************WebUpload 單文件上傳 begin*****************************************/
$(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( "<div id='"+ file.id + "' class='item'>" +
"<h4 class='info'>" + file.name + "</h4>" +
"<p class='state'>期待上傳...</p>" +
"</div>" );
});
//當一切文件上傳停止時觸發
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();
})
});
/*********************************WebUpload 單文件上傳 end*******************************************/
/*********************************WebUpload 多文件上傳 begin*****************************************/
$(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( "<div id='"+ file.id + "' class='item'>" +
"<h4 class='info'>" + file.name + "</h4>" +
"<p class='state'>期待上傳...</p>" +
"</div>" );
});
// 當開端上傳流程時觸發
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<fileArray.length;i++){
uploader.cancelFile(fileArray[i]);
uploader.removeFile(fileArray[i],true);
}
uploader.reset();
fileSize = 0;
fileName = [];
fileSizeOneByOne=[];
});
//當validate欠亨過時,會以派送毛病事宜的情勢告訴挪用者
uploader.on("error",function(){
console.log("error");
uploader.reset();
fileSize = 0;
fileName = [];
fileSizeOneByOne=[];
alert("error");
})
//假如是在模態框裡的上傳按鈕,點擊file的時刻不會觸發控件
//修復model外部點擊不會觸發選擇文件的BUG
/* $("#multi .webuploader-pick").click(function () {
uploader.reset();
fileSize = 0;
fileName = [];
fileSizeOneByOne=[];
$("#multi :file").click();//症結代碼
});*/
//選擇文件以後履行上傳 
$(document).on("change","input[name='multiFile']", function() {
var fileArray1 = uploader.getFiles();
for(var i = 0 ;i<fileArray1.length;i++){
//後台用
fileSize +=fileArray1[i].size;
fileSizeOneByOne.push(fileArray1[i].size);
fileName.push(fileArray1[i].name);
}
console.log(fileSize);
console.log(fileSizeOneByOne);
console.log(fileName);
})
/**
* 多文件上傳
*/
$("input[name='multiUpload']").on("click",function(){
uploader.upload();
})
});
/*********************************WebUpload 多文件上傳 end*****************************************/
/************************************webuploader的自帶參數提交到後台的參數列表*************************
* {
//web uploader 的自帶參數 
lastModifiedDate=[Wed Apr 27 2016 16:45:01 GMT+0800 (中國尺度時光)], 
chunks=[3], chunk=[0], 
type=[audio/wav], uid=[yangl], id=[WU_FILE_0], 
size=[268620636], name=[3.wav],
//formData的參數
contentsDto.contentsId=[0000004730], existFlg=[false], 
status=[file], uploadNum=[0000004730]
}
*********************************************************************************************/

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

/**
* 指定地位開端寫入文件
* @param tempFile 輸出文件
* @param outPath 輸入文件的途徑(途徑+文件名)
* @throws IOException
*/
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插件上傳年夜文件單文件和多文件的辦法小結的相干常識,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved