jquery file upload 後台收到的檔案名稱中文亂碼, filename中文亂碼,jqueryfilename
本周用jquery file upload做上傳檔案的功能,後台會接受檔案,並且截取檔案名稱作為字元存入資料庫。準系統實現時候,試了幾個檔案,發現如果檔案名稱如果沒有中文就OK,如果檔案名稱帶中文的話,後台收到的就是中文亂碼,怎麼去解碼都沒用。
例如,上傳的檔案叫做“昕銳配置表.xls”,但是到後台收到的卻是 “鏄曢攼閰嶇疆琛?xls” ,如:
似乎也不是解碼能解決的問題。
於是乎想弄清楚這個檔案名稱是在哪個環節出問題的。首先寫了一個最簡單的html頁面,裡面就是最原始的FORM表單,然後提交後台,發現一切正常,檔案名稱是對的,因此大概可以判斷和後台無關,很可能就是jquery file upload這個外掛程式的問題。
於是,用http工具觀察了一下上傳檔案時傳輸的資訊,發現如下問題,主要是POSTDATA部分的Content-Disposition中的filename部分:
原生的FROM提交時,這個filename是正常的:
而用jquery file upload這個外掛程式提交時,這個filename就已經亂了:
於是乎,已經成功地定位了問題產生的環節,就是在jquery file upload這個外掛程式的問題。估計是這個外掛程式的作者沒怎麼考慮字元編碼的問題。
關於javascript的字元編碼問題,好像曾經也接觸過一點,好像是類似於 encodeURI() 或者 encodeURICompent() 這些方法。不過,現在首要的任務是找出jquery.fileupload.js這個檔案中是哪一步設定了 filename 這個參數。
整整兩天,測試來測試去,最終找到了這個地方:這個js中有個成員叫做 _initXHRData, 是一個function, 在這個function的最後部分有一個if-else分支,如下:
if (options.blob) { formData.append(paramName, options.blob, file.name); } else { $.each(options.files, function (index, file) { // This check allows the tests to run with // dummy objects: if (that._isInstanceOf('File', file) || that._isInstanceOf('Blob', file)) { formData.append( ($.type(options.paramName) === 'array' && options.paramName[index]) || paramName, file, file.uploadName || file.name ); } }); }
實際測試表明,程式會進入else這個分支,並且,else分支中的最後一步,也就是formData.append()這個方法中會對 filename 進行設定,具體的值就是最後一行的
file.uploadName || file.name
很顯然,這裡並沒有對這個檔案名稱做任何編碼處理,發送出去確實容易導致編碼的問題。因此,就在這裡用encodeURI()方法做一下處理:
encodeURI(file.uploadName || file.name)
然後再次測試,這次發送的http資訊中的filename就變成了進行編碼處理過的字串:
然後在後台,用java.net.URLDecoder進行解碼:
fileName = URLDecoder.decode(fileDetail.getFileName(), "UTF-8");
OK,正確輸出:
這個外掛程式導致的中文亂碼問題終於搞定,花了整整4天了!
總結:很多問題看上去完全是無從下手,但仔細想想,其實我們手上有很多實用的工具,我們要做的就是利用好這些工具,抓住每一點蛛絲馬跡,堅信沒有解決不了的技術問題,一步一步進行推導,最終找到問題的根源,並加以解決。
所謂解決不了的技術問題,多半是因為對這些技術以及相關的知識不夠熟悉罷了。只要相關的知識夠豐富,經驗夠多,解決特定的問題會很輕鬆。
jquery uploadfiy多檔案上傳,struts1後台檔案名稱中文亂碼,解決,前台gbk
下面是我開發過程遇到的一些問題總結:
1、上傳失敗 IO ERROR ------測試是否是 servlet 等配置或者關注flash的版本
2、前台傳參中文亂碼 -----------這個要根據應用伺服器不同可能不同吧...反正只要我們的 介面、介面傳參以及後台接收的編碼設定一致應該就沒上面問題..反正這個問題好解決的...
3、批量上傳的時候,只有第一個附件上傳的時候可以接收到前台傳來的name參數,而後面的參數都為null-------設定'simUploadLimit' : 1, // 一次同步上傳的檔案數目為 1,問題解決...當初這個問題可是難了我好久!fuck
來源blog.csdn.net/...091013
jquery非同步提交中文亂碼,提交到背景資料正常顯示,但是叫提交到背景資料從新返回到前台,前台中文亂碼
後台和前台的編碼不統一,解決方案是統一編碼,比如都用UTF-8