一、無法在iis下顯示上傳按鈕的問題
注意在js中,路徑要絕對按照下面的方式書寫:
flash_url: '@Url.Content("~/Common/SwfUpload/swfupload.swf")',
button_image_url: '@Url.Content("~/Common/SwfUpload/TestImageNoText_65x29.png")',
如果寫成
button_image_url: '/Common/SwfUpload/TestImageNoText_65x29.png")',
則在iisexpress中調試能夠通過,但在iis中啟動並執行時候會出現錯誤,原因是前者會將虛擬路徑加上,後者不會。
最終造成的問題是:1、上傳按鈕不會顯示;2、當然也無法點擊開啟檔案對話方塊,因為swf檔案也無法載入。
二、上傳路徑的寫法:
假設我們使用UploadController的Upload方法,來處理上傳,那麼:
1、參數要一致,當然,我們可以不要設定參數,只用Request.Files來獲得傳來的檔案
2、路徑和flash_url一致,也用url.Content,當然也可用Url.Action
三、後台代碼的書寫:
對於1個檔案,對於多個檔案
四、檔案大小限制
五、file和swfupload的區別:
原理上說,swfupload在本地讀取檔案,我們通過js能夠擷取本地的進度。因此,開始傳了多少,在尚未到達伺服器的時候我們就知道。
file控制項則是整個檔案傳遞到伺服器後我們才能知道進度,當然,有一些特別的服務端的方法,可以解析請求內容,得到“到達的數量”
因此,swfupload通過js輪詢本地的進度。
當然,如果服務端處理耗時較長的話,也可以由本地js,輪詢服務端某個進度值。
所以,可以統一進度條的樣式,服務端處理通常包括:1、將到達的請求(已經包含整個檔案)儲存到磁碟上;2、如果是匯入操作,再將其加入資料庫。
這是對excel之類的情形,如果以某種檔案形式上傳匯入到資料庫,則無需儲存檔案的操作,僅針對stream處理即可。
六、考慮用戶端禁用java或未安裝Flash的問題
七、封裝上傳功能:
實際上,對於單檔案上傳,理想的方法是提供一個按鈕,選擇檔案後,在按鈕後方或者下方,出現檔案名稱,正在上傳和一個進度條。當然,能夠顯示上傳耗時、剩餘多少時間、上傳速度最好。
上傳結束後,保持這些資訊,同時顯示“上傳成功”,下次選擇檔案的時候,重複此動作。
如果用戶端禁用js,則改用file控制項,不顯示進度---此時也無法通過js做什麼。
如果用戶端可用js,但未安裝flash,這時可以用一個滾動的gif圖形,粗略的表示上傳進行中。
對於多檔案,方式差不多。大體上,swfupload官網的Demo包括file隊列、速度等js檔案,改改就能用。
對於Asp.net mvc,實際上可以有兩種封裝方法:
1、封裝為htmlhelper
2、全域提供唯一的一個上傳Action,各處調用。