最近項目中須要實現多文件上傳功能,因而結合需求最終選擇了Uploadify這一款控件來實現。相比其餘控件,Uploadify具備簡潔的界面,功能API基本能夠解決大多數需求,又是基於jquery的,配置起來相對容易。可是不用不知道,一用起來發現坑仍是蠻多了,相信大部分用過的人都會遇到,下面就來分享下個人填坑過程:javascript
根據官網文檔配置好我所須要的前端配置項,再讓後臺同事把對應的後臺配置搞定後,在chrome下嘗試了下一些ok。心想這樣就大工告成了?呵呵。。。那麼問題來了。php
1、使用Uploadifyhtml
(1)、chrome報錯前端
按F12打開調試面板刷新頁面後會顯示以下錯誤信息:html5
這是啥?請求了3次失敗了2次最後成功了1次,後來發現只有chrome下會報這個錯誤,大概是由於chrome對於swf文件的安全性措施致使的,由於不影響功能,暫時沒去管它。java
(2)、發現火狐上失效jquery
當我打開火狐的時候,忽然發現按鈕失效,就是一個type='file'的按鈕,只能單文件上傳,緣由很簡單,那即是火狐檢測不到個人flash。而Uploadify是一款利用flash來實現多文件上傳功能,這對沒有安裝flash的用戶來講無疑根本無法用。git
好吧,可是我選擇先忍了,由於開發的是一款後臺應用,給本身人用的,因此大不了讓他們安裝下flash,使用chrome瀏覽器來訪問好了。github
(3)、文件上傳完畢後會自動消失web
根據項目需求,文件上傳完畢後仍然留在頁面上,並顯示相應信息。然而Uploadify默認上傳成功後會自動刪除頁面上的文件。這個問題解決起來很簡單,有相應的API來實現:
1 $("#file_upload").uploadify({ 2 'removeCompleted' : false, 3 'swf' : '/uploadify/uploadify.swf', 4 'uploader' : '/uploadify/uploadify.php' 5 });
將removeCompleted設置爲false便可。若是須要將上傳失敗的文件也保留在頁面上,能夠設置'removeTimeout' 的值無限制大,這樣不用設置removeCompleted也行。
(4)上傳完畢文件沒法清除
若是保留上傳完畢文件,那麼呵呵了,文件不會由於你觸發cancel方法而清除,即便頁面上清除了,等你再選擇已經上傳完的文件後,會顯示提示你文件已存在,是否覆蓋的彈框。
百度許久後發現這是一個公認的bug,暫時沒有很好的解決方案。因而我再也忍不住了,果斷捨棄flash版本的Uploadify,換用其html5版本的UploadiFive。
2、使用UploadiFive
然而自從換了UploadiFive後,心情果斷舒暢了不少,以前(1)(2)(3)(4)中的問題蕩然無存了,心想這不是逼咱們購買付費版嘛。。。
可是UploadiFive卻拋棄了Uploadify中的一些功能:
(1)無未上傳文件重複提示
Uploadify中添加同名文件會提示是否覆蓋,而UploadiFive倒是直接覆蓋,沒有提示信息。能夠接受。
(2)上傳完畢後進度條消失
Uploadify中上傳完畢會默認保留進度條並顯示100%,前提設置removeCompleted爲false,而UploadiFive中上傳完畢後進度條自動消失。勉強接受。
(3)無自動檢測文件大小功能
Uploadify中選擇文件加入隊列後,會在文件名後自動加上該文件的大小,而UploadiFive卻沒有該功能,這不是故意爲難咱們嗎......僞裝接受不了。因而開始研究其源代碼。
1個多小時後解決了這個問題。
下面是解決方案:
首先UploadiFive的js文件是壓縮過的,最好還原其源代碼,在sublime text3中安裝HTML-CSS-JS Prettify插件後利用快捷鍵shift+alt+H 可快速實現js格式化。
格式化後找到jquery.uploadifive.js中的$data.addQueueItem方法,在
file.queueItem.find('.filename').html(fileName)後添加
/*如下添加文件大小檢測*/ var fileSize = Math.round(file.size / 1024); var suffix = 'KB'; if (fileSize > 1000) { fileSize = Math.round(fileSize / 1000); suffix = 'MB'; } var fileSizeParts = fileSize.toString().split('.'); fileSize = fileSizeParts[0]; if (fileSizeParts.length > 1) { fileSize += '.' + fileSizeParts[1].substr(0, 2); } fileSize += suffix; file.queueItem.find('.filesize').html('('+fileSize+')'); /*以上添加文件大小檢測*/
同時找到$data.queueItem,在其中添加<span class="filesize"></span>
if (settings.itemTemplate == false) { $data.queueItem = $('<div class="uploadifive-queue-item">\ <a class="close" href="#">X</a>\ <div><span class="filename"></span><span class="filesize"></span><span class="fileinfo"></span></div>\ <div class="progress">\ <div class="progress-bar"></div>\ </div>\ </div>'); } else { $data.queueItem = $(settings.itemTemplate); }
這樣就ok了,
以上即是個人填坑過程,相信不少人都會遇到,特此分享!
同時在這裏推薦另外兩款實用的多文件上傳控件,根據項目需求使用:
a、jQuery File Upload 官網:http://blueimp.github.com/jQuery-File-Upload/
b、百度的Web Uploader 官網:http://fex.baidu.com/webuploader/
Uploadify v3.2.1 參數說明
1、屬性
屬性名稱 | 默認值 | 說明 |
auto | true | 設置爲true當選擇文件後就直接上傳了,爲false須要點擊上傳按鈕才上傳 。 |
buttonClass | 」 | 按鈕樣式 |
buttonCursor | ‘hand’ | 鼠標指針懸停在按鈕上的樣子 |
buttonImage | null | 瀏覽按鈕的圖片的路徑 。 |
buttonText | ‘SELECT FILES’ | 瀏覽按鈕的文本。 |
checkExisting | false | 文件上傳重複性檢查程序,檢查即將上傳的文件在服務器端是否已存在,存在返回1,不存在返回0 |
debug | false | 若是設置爲true則表示啓用SWFUpload的調試模式 |
fileObjName | ‘Filedata’ | 文件上傳對象的名稱,若是命名爲’the_files’,PHP程序能夠用$_FILES['the_files']來處理上傳的文件對象。 |
fileSizeLimit | 0 | 上傳文件的大小限制 ,若是爲整數型則表示以KB爲單位的大小,若是是字符串,則可使用(B, KB, MB, or GB)爲單位,好比’2MB’; 若是設置爲0則表示無限制 |
fileTypeDesc | ‘All Files’ | 這個屬性值必須設置fileTypeExts屬性後纔有效,用來設置選擇文件對話框中的提示文本,如設置fileTypeDesc爲「請選擇rar doc pdf文件」 |
fileTypeExts | ‘*.*’ | 設置能夠選擇的文件的類型,格式如:’*.doc;*.pdf;*.rar’ 。 |
formData | JSON格式上傳每一個文件的同時提交到服務器的額外數據,可在’onUploadStart’事件中使用’settings’方法動態設置。 | |
height | 30 | 設置瀏覽按鈕的高度 ,默認值 |
itemTemplate | false | 用於設置上傳隊列的HTML模版,可使用如下標籤: instanceID – Uploadify實例的ID fileID – 列隊中此文件的ID,或者理解爲此任務的ID fileName – 文件的名稱 fileSize – 當前上傳文件的大小 插入模版標籤時使用格式如:${fileName} |
method | Post | 提交方式Post或Get |
multi | true | 設置爲true時能夠上傳多個文件。 |
overrideEvents | 設置哪些事件能夠被重寫,JSON格式,如:’overrideEvents’ : ['onUploadProgress'] | |
preventCaching | true | 若是爲true,則每次上傳文件時自動加上一串隨機字符串參數,防止URL緩存影響上傳結果 |
progressData | ‘percentage’ | 設置上傳進度顯示方式,percentage顯示上傳百分比,speed顯示上傳速度 |
queueID | false | 設置上傳隊列容器DOM元素的ID,若是爲false則自動生成一個隊列容器。 |
queueSizeLimit | 999 | 隊列最多顯示的任務數量,若是選擇的文件數量超出此限制,將會出發onSelectError事件。 注意此項並不是最大文件上傳數量,若是要限制最大上傳文件數量,應設置uploadLimit。 |
removeCompleted | true | 是否自動將已完成任務從隊列中刪除,若是設置爲false則會一直保留此任務顯示。 |
removeTimeout | 3 | 若是設置了任務完成後自動從隊列中移除,則能夠規定從完成到被移除的時間間隔。 |
requeueErrors | false | 若是設置爲true,則單個任務上傳失敗後將返回錯誤,並從新加入任務隊列上傳。 |
successTimeout | 30 | 文件上傳成功後服務端應返回成功標誌,此項設置返回結果的超時時間 |
swf | ‘uploadify.swf’ | uploadify.swf 文件的相對路徑。 |
uploader | uploadify.php | 後臺處理程序的相對路徑。 |
uploadLimit | 999 | 最大上傳文件數量,若是達到或超出此限制將會觸發onUploadError事件。 |
width | 120 | 設置文件瀏覽按鈕的寬度。 |
2、事件
事件名稱 | 說明 |
onCancel(file) | 當點擊文件隊列中文件的關閉按鈕或點擊取消上傳時觸發,file參數爲被取消上傳的文件對象 |
onClearQueue(queueItemCount) | 當調用函數cancel方法時觸發,queueItemCount參數爲被取消上傳的文件數量。 |
onDestroy() | 當destory方法被調用時觸發 |
onDialogClose(queueData) | 當文件瀏覽框關閉時觸發,若是將此事件被重寫,則當向隊列添加文件上傳出錯時不會彈出錯誤消息提示。 queueData對象包含以下屬性:
|
onDialogOpen() | 當文件選擇對話框彈出時當即出發,但可能在文件選擇對話框被關閉以前並不能所有執行。 |
onDisable() | 當disable方法禁用Uploadify上傳按鈕時被調用時觸發。 |
onEnable() | 當disable方法啓用Uploadify上傳按鈕時被調用時觸發。 |
onFallback() | 當Uploadify初始化過程當中檢測到當前瀏覽器不支持flash時觸發。 |
onInit() | 首次初始化Uploadify結束時觸發。 |
onQueueComplete(queueData) | 文件上傳隊列處理完畢後觸發。 queueData對象包含以下屬性:
|
onSelect(file) | 選擇文件後向隊列中添加每一個上傳任務時都會觸發。 |
onSelectError(file, errorCode, errorMsg) | 選擇文件後向隊列中添加每一個上傳任務時若是失敗都會觸發。 file – 文件對象 errorCode – 錯誤代碼以下:
errorMsg – 錯誤提示,可經過’this.queueData.errorMsg’定製 |
onSWFReady() | Flash文件載入成功後觸發。 |
onUploadComplete(file) | 每一個文件上傳完畢後不管成功與否都會觸發。 |
onUploadError(file, errorCode, errorMsg, errorString) | 文件上傳出錯時觸發,參數由服務端程序返回。 |
onUploadProgress(file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal) | 處理上傳隊列的過程當中會屢次觸發此事件,每當任務狀態有更新時都會觸發。
|
onUploadStart(file) | 當文件即將開始上傳時當即觸發 |
onUploadSuccess(file, data, response) | 當文件上傳成功時觸發
|
3、方法
方法名稱 | 說明 | 應用舉例 |
cancel(fileID, suppressEvent) | 取消隊列中的任務,無論此任務是否已經開始上傳
|
<a href="javascript:$(‘#file_upload’).uploadify(‘cancel’)">取消第一個</a> <a href="javascript:$(‘#file_upload’).uploadify(‘cancel’, ‘*’)">清空隊列</a> <a href="javascript:$(‘#file_upload’).uploadify(‘upload’, ‘*’)">開始上傳全部任務</a> |
destroy() | 銷燬Uploadify實例並將文件上傳按鈕恢復到原始狀態 | <a href="javascript:$(‘#file_upload’).uploadify(‘destroy’)">銷燬Uploadify實例</a> |
disable(setDisabled) | 禁用或啓用文件瀏覽按鈕 setDisabled – 設置爲true表示禁用,false爲啓用 |
<a href="javascript:$(‘#file_upload’).uploadify(‘disable’, true)">禁用按鈕</a> <a href="javascript:$(‘#file_upload’).uploadify(‘disable’, false)">啓用按鈕</a> |
settings(name, value, resetObjects) | 獲取或設置Uploadify實例參數
|
$(‘#file_upload’).uploadify(‘settings’,'buttonText’,'BROWSE’); $(‘#file_upload’).uploadify(‘settings’,'buttonText’)); |
stop() | 中止當前正在上傳的任務 | <a href="javascript:$(‘#file_upload’).uploadify(‘upload’, ‘*’)">開始上傳</a> <a href="javascript:$(‘#file_upload’).uploadify(‘stop’)">中止上傳</a> |
upload(fileID) | 當即上傳指定的文件,若是fileID爲’*'表示上傳全部文件,要指定上傳多個文件,則將每一個文件的fileID做爲一個參數 | <a href="javascript:$(‘#file_upload’).uploadify(‘upload’,'*’)">開始上傳所 |
原創文章,轉載請註明來自一個蘿蔔一個坑 -博客園[http://www.cnblogs.com/luozhihao]