jquery uploadify文件上傳插件用法精析
CreationTime--2018年8月2日11點12分
Author:Marydon
一、參數說明
1.參數設置
$("#file_upload").uploadify({ height : 30,//高度 swf : '/uploadify/uploadify.swf',//指定swf文件 uploader : '/uploadify/uploadify.do',//后台處理的url width : 120,//寬度 buttonText: '上傳圖片', //按鈕顯示的文字 fileTypeExts: '*.*',//上傳文件的類型,多個類型使用;分割'*.gif; *.jpg; *.png',默認值為:'*.*' fileTypeDesc: 'Image Files',//這個屬性值必須設置fileTypeExts屬性后才有效,用來設置選擇文件對話框中的提示文本,默認值為:All Files formData: {'someKey':'someValue','someOtherKey':1},//發送給后台的其他參數通過formData指定 queueID: 'fileQueue',//可以為DOM元素的id,設置隊列樣式, 默認值為false,隊列id動態生成,不帶# auto: true,//選擇文件后自動上傳,默認值為:true multi: true,//設置為true將允許多文件上傳,默認值為:true buttonClass:'xttblog',//上傳按鈕的樣式 buttonImage:'',//按鈕的圖片路徑 buttonCursor:'hand',//鼠標指針懸停在按鈕上的樣子,默認值為:hand checkExisting:'/uploadify/check-exists.do',//文件的路徑,檢查目標文件夾中是否已上載的文件的名稱.如果文件名不存在,該腳本將返回1,如果文件名存在或0,默認值為false debug:true,//打開swfupload調試模式,默認值為:false fileObjName:'Filedata',//后台可以通過這個名字獲取到文件對象,默認值為:Filedata fileSizeLimit:'',//允許文件上傳的最大大小.這個值可以是數字或字符串.如果它是一個字符串,它接受一個單位(B,KB,MB,GB),默認單位為KB。值設置為0,表示要上傳的文件大小無限制(單文件大小) itemTemplate:'',//選擇不同的HTML模板,添加上傳文件到上傳隊列。主要有4種模板:instanceID(uploadify實例id)、fileID(文件id)、fileName(文件名字)、fileSize(文件大小).例如:${fileName},默認值為:false method:'POST',//POST或GET,默認值為post overrideEvents:['onUploadProgress'],//重寫事件,onUploadProgress進度條不更新,jsonArray,默認值為:空數組[] preventCaching:true,//是否緩存,默認值為:true不緩存 progressData:'percentage',//進度條percentage百分百、speed上傳速度更新,默認值為:percentage queueSizeLimit:999,//隊列大小,超過將觸發onselecterror事件,和uploadLimit類似,默認值為:999 removeCompleted:true,//上傳完成后是否刪除上傳隊列,默認值為:true removeTimeout:3,//上傳完成后,延遲3秒刪除隊列,默認值為:3秒 requeueErrors:true,//如果為true上傳失敗后將繼續嘗試再次上傳,默認值為:fasle successTimeout:30,//文件上傳成功后服務端應返回成功標志,此項設置返回結果的超時時間,默認值為:30秒 uploadLimit:999,//最大上傳文件數量,如果達到或超出此限制將會觸發onUploadError事件,默認值為:999 });
2.事件設置
$("#file_upload").uploadify({ onCancel : function(file) { //移除文件時觸發 }, onClearQueue:function(queueItemCount){ //當調用函數cancel方法且queueItemCount>1時才觸發,queueItemCount參數為被取消上傳的文件數量 }, onDestroy:function(queueItemCount){ //當destory方法被調用時觸發 }, onDialogClose:function(queueData){ //當文件瀏覽框關閉時觸發,如果將此事件被重寫,則當向隊列添加文件上傳出錯時不會彈出錯誤消息提示 //queueData對象包含如下屬性: //filesSelected 文件選擇對話框中共選擇了多少個文件 //filesQueued 已經向隊列中添加了多少個文件 //filesReplaced 已經向隊列中替換了多少個文件 //filesCancelled 取消了多少個文件 //filesErrored 出錯了多少個文件 }, onDialogOpen:function(){ //當文件選擇對話框彈出時立即出發,但可能在文件選擇對話框被關閉之前並不能全部執行 }, onDisable:function(){ //當disable方法禁用Uploadify上傳按鈕時被調用時觸發 }, onEnable:function(){ //當disable方法啟用Uploadify上傳按鈕時被調用時觸發 }, onFallback:function(){ //當Uploadify初始化過程中檢測到當前瀏覽器不支持flash時觸發 alert("當前瀏覽器未安裝或未啟用flash插件,無法進行文件上傳!"); }, onInit:function(){//首次初始化Uploadify結束時觸發 }, onQueueComplete:function(queueData){ //文件上傳隊列處理完畢后觸發,queueData對象包含如下屬性: //uploadsSuccessful上傳成功的文件數量 //uploadsErrored上傳失敗的文件數量 }, onSelect:function(file){//選擇文件后向隊列中添加每個上傳任務時都會觸發 }, onSelectError:function(file, errorCode, errorMsg){ //選擇文件后向隊列中添加每個上傳任務時如果失敗都會觸發 //file文件對象 //errorCode錯誤代碼如下: //QUEUE_LIMIT_EXCEEDED任務數量超出隊列限制; //FILE_EXCEEDS_SIZE_LIMIT文件大小超出限制; //ZERO_BYTE_FILE文件大小為0 //INVALID_FILETYPE文件類型不符合要求 //errorMsg錯誤提示,可通過'this.queueData.errorMsg'定制 }, onSWFReady:function(){//Flash文件載入成功后觸發 }, onUploadComplete:function(file){//每個文件上傳完畢后無論成功與否都會觸發 }, onUploadError:function(file, errorCode, errorMsg, errorString){ //文件上傳出錯時觸發,參數由服務端程序返回 }, onUploadProgress:function(file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal){ //處理上傳隊列的過程中會多次觸發此事件,每當任務狀態有更新時都會觸發 //file文件對象 //bytesUploaded已上傳的字節數 //bytesTotal文件總字節數 //totalBytesUploaded當前任務隊列中全部文件已上傳的總字節數 //totalBytesTotal當前任務隊列中全部文件的總字節數 }, onUploadStart:function(file){//當文件即將開始上傳時立即觸發 }, onUploadSuccess:function(file, data, response){ //當文件上傳成功時觸發 //file文件對象 //data服務端輸出返回的信息,數據格式必須是字符串,否則接收不到 //response有輸出時為true,如果無響應為false,如果返回的是false,當超過successTimeout設置的時間后假定為true } });
3.方法調用
cancel(fileID, suppressEvent)
用途:
取消隊列中的任務,不管此任務是否已經開始上傳
參數說明:
fileID要取消的文件ID,如果為空則取消隊列中第一個任務,如果為'*'則取消所有任務
suppressEvent是否阻止觸發onUploadCancel事件,當清空隊列時非常實用
示例:
$('#file_upload').uploadify('cancel');// 取消第一個 $('#file_upload').uploadify('cancel','*');// 清空隊列
destroy()
用途:
銷毀Uploadify實例並將文件上傳按鈕恢復到原始狀態
示例:
$('#file_upload').uploadify('destroy');// 銷毀Uploadify實例
disable(setDisabled)
用途:
禁用或啟用文件瀏覽按鈕
參數說明:
setDisabled – 設置為true表示禁用,false為啟用
示例:
$('#file_upload').uploadify('disable',true);// 禁用按鈕
settings(name, value, resetObjects)
用途:
獲取或設置Uploadify實例參數
參數說明:
name – 屬性名稱,如果只提供屬性名稱則表示獲取其值
value – 屬性值
resetObjects – 設置為true時,更新postData對象將清空現有的值。否則,新的值將被添加到其末尾
示例:
$('#file_upload').uploadify('settings','buttonText','BROWSE');// 將按鈕參數的值改為BROWSE $('#file_upload').uploadify('settings','buttonText'));// 獲取到按鈕參數的值
stop()
用途:
停止當前正在上傳的任務
示例:
$('#file_upload').uploadify('stop');//停止上傳
upload(fileID)
用途:
立即上傳指定的文件,如果fileID為’*'表示上傳所有文件,要指定上傳多個文件,則將每個文件的fileID作為一個參數
示例:
$('#file_upload').uploadify('upload','*');// 開始上傳所有文件
二、調用
第一步:頁面隨意設置一個id="file_upload"的html元素
<!-- 文件上傳 --> <div id="file_upload"></div>
說明:指定一個dom元素的id,該dom元素在uploadify初始化后會被Flash按鈕代替,這個dom元素相當於一個占位符。
第二步:頁面加載完畢后,綁定並設置參數
// 頁面加載完畢后,才能獲取到file_upload這個dom對象 $(function(){ $('#file_upload').uploadify({ // 參數配置 }); });
加載成功,頁面元素展示
三、數據交互
1.前台如何傳參?
方法一:get傳參
方式一(正確方式):通過onUploadStart實現(推薦使用)
$('#file_upload').uploadify({ 'method', 'get', 'buttonText' : '添加文件', 'fileTypeExts' : '*.gif; *.jpg; *.png;*.pdf;*.zip;',// 文件類型限制 'fileTypeDesc' : '請選擇gif jpg png pdf zip類型的文件',// 文件類型描述 'swf' : baseUrl + '/uploadify/flash/uploadify.swf',// flash插件 'uploader' : baseUrl + '/uploadFile.do',// 上傳的文件請求處理 'onDialogClose' : function(queueData) {// 選擇文件窗口關閉時,觸發 }, 'onUploadStart' : function(file){// 文件上傳前,觸發 // 請求參數:上傳每個文件的同時提交到服務器的額外數據,中文需要編碼 $('#file_upload').uploadify("settings","formData",{ 'param1' : encodeURI('測試文件上傳傳參'), 'param2' : $('#aa').val()// 動態參數 }); }, 'onUploadSuccess' : function(file, data, response) {// 上傳成功 window.open(baseUrl + '/fileList.jsp'); }, 'onUploadError' : function(file, errorCode, errorMsg, errorString) {// 上傳失敗 }, 'onFallback' : function(){// 文件上傳按鈕加載失敗 alert("當前瀏覽器未安裝或未啟用flash插件,無法進行文件上傳!"); } });
方式二(錯誤實現方式):直接聲明
直接聲明 'formData' : {'param1': encodeURI('測試文件上傳傳參')},這種方式后台接收不到傳遞的參數。
方法二:post傳參
方式一:通過onUploadStart實現(推薦使用)
$('#file_upload').uploadify({ 'method', 'post',// 默認值為post,可以不聲明 'buttonText' : '添加文件', 'fileTypeExts' : '*.gif; *.jpg; *.png;*.pdf;*.zip;',// 文件類型限制 'fileTypeDesc' : '請選擇gif jpg png pdf zip類型的文件',// 文件類型描述 'swf' : baseUrl + '/uploadify/flash/uploadify.swf',// flash插件 'uploader' : baseUrl + '/uploadFile.do',// 上傳的文件請求處理 'onDialogClose' : function(queueData) {// 選擇文件窗口關閉時,觸發 }, 'onUploadStart' : function(file){// 文件上傳前,觸發 // 請求參數:上傳每個文件的同時提交到服務器的額外數據,中文需要編碼 $('#file_upload').uploadify("settings","formData",{ 'param1' : encodeURI('測試文件上傳傳參'), 'param2' : $('#aa').val()// 動態參數 }); }, 'onUploadSuccess' : function(file, data, response) {// 上傳成功 window.open(baseUrl + '/fileList.jsp'); }, 'onUploadError' : function(file, errorCode, errorMsg, errorString) {// 上傳失敗 }, 'onFallback' : function(){// 文件上傳按鈕加載失敗 alert("當前瀏覽器未安裝或未啟用flash插件,無法進行文件上傳!"); } });
方式二: 直接聲明
'formData' : {'param1': encodeURI('測試文件上傳傳參')},
2.后台如何接收到參數?
方式一對應的接收參數的方法為:
// 通過指定onUploadStart()獲取參數 String param1 = request.getParameter("param1"); // 解碼 param1 = URLDecoder.decode(param1, "utf-8");
方式二對應的接收參數方法為:
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { // 通過設置formData獲取參數 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletContext servletContext = this.getServletConfig().getServletContext(); File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); factory.setRepository(repository); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> items = upload.parseRequest(req); // 7.對所有請求信息進行判斷 Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { FileItem item = iter.next(); // form表單格式 if (item.isFormField()) { String paramName = item.getFieldName(); if ("param1".equals(paramName)) { String paramValue = item.getString(); // 解碼 paramValue = URLDecoder.decode(paramValue, "utf-8"); System.out.println("參數名:" + paramName + "=" + paramValue); } } else { // 文件格式處理 TODO } } } catch (Exception e) { e.printStackTrace(); } }
3.小結:
推薦使用第一種方式進行傳參;
不管是get傳參還是post傳參,參數值為中文時,都需要先進行編碼,否則后台接收到的數據亂碼(比如:使用encodeURI());
不管在初始化的時候,定義的uploadify對象,定義的是post還是get,最終是以post方式進行提交的。
四、如何設置手動上傳?
第一步:設置參數
'auto' : false,
第二步:頁面設置按鈕
<div id="ctrlUpload"> <a href="javascript:;" onclick="$('#file_upload').uploadify('upload', '*');" class="Button" onmouseover="javascript:this.className='ButtonOver'" onmouseout="javascript:this.className='Button'"> 上傳所有 </a> <a href="javascript:;" onclick="$('#file_upload').uploadify('cancel', '*');$('#ctrlUpload').hide();" class="Button" onmouseover="javascript:this.className='ButtonOver'" onmouseout="javascript:this.className='Button'"> 取消上傳 </a> </div>