今天做了一個檔案上傳功能。以前有過多次檔案上傳經驗結果這次确确實實把我難住了。
本次上傳借助commons-fileupload-1.2.1.jar進行上傳,本地測試檔案上傳成功,且并未出現亂碼問題(測試過如果不含檔案上傳的表單能正常送出且正常顯示),但釋出到伺服器上結果表單元素出現了中文亂碼問題。
代碼如下:
final DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold(this.diskFileSize);
{ // 采用系統臨時檔案目錄作為上傳的臨時目錄
final File tempfile = new File(System.getProperty("java.io.tmpdir"));
diskFileItemFactory.setRepository(tempfile);
}
final ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
fileUpload.setSizeMax(1024 * 1024 * 4);//限制檔案最大上傳數量
fileUpload.setHeaderEncoding("UTF-8");
try {
fileList = fileUpload.parseRequest(request);
} catch (final FileUploadException e) {
// 存在資訊讀取問題,傳回錯誤資訊
e.printStackTrace();
super.error.put("資訊讀取錯誤問題", "錯誤資訊是:" + e.getMessage());
return;
}
}
// 進行
String fieldName;
this.map = new HashMap<String, Object>();
for (final FileItem file : fileList) {
if (file.isFormField()) {
fieldName = file.getFieldName();
try {
map.put(fieldName, file.getString());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else {
this.map.put(file.getFieldName(), file);
}
}
這樣設定本機會通過,通常情況下不會報錯。結果放在linux伺服器上結果就出現了中文亂碼。起初以為是linux編碼格式問題,結果修改linux系統編碼EN_US,zh_CN,zh_US試過很多編碼格式都不正确,網上也找了很多資料,沒解決。判斷解決方法思路出錯,轉向表單送出方式。因為檔案上傳都會設定FORM表單的ENCTYPE="multipart/form-data"值。調試發現表單送出到背景的時候元素值就已經是亂碼了。
參考了一些網上的解決方案:
[url]http://www.360doc.com/content/07/0705/12/12224_595521.shtml[/url]
[url]http://www.blogjava.net/duduli/archive/2008/11/11/239845.html[/url]等,綜合這些牛人們的解決方案,在他們的基礎上修改了一些編碼,送出測試亂碼問題解決。
解決代碼如下:
final DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold(this.diskFileSize);
{ // 采用系統臨時檔案目錄作為上傳的臨時目錄
final File tempfile = new File(System.getProperty("java.io.tmpdir"));
diskFileItemFactory.setRepository(tempfile);
}
final ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
fileUpload.setSizeMax(this.maxSize);
fileUpload.setHeaderEncoding(request.getCharacterEncoding());
try {
fileList = fileUpload.parseRequest(request);
} catch (final FileUploadException e) {
// 存在資訊讀取問題,傳回錯誤資訊
e.printStackTrace();
super.error.put("資訊讀取錯誤問題", "錯誤資訊是:" + e.getMessage());
return;
}
}
// 進行
String fieldName;
this.map = new HashMap<String, Object>();
for (final FileItem file : fileList) {
if (file.isFormField()) {
fieldName = file.getFieldName();
try {
map.put(fieldName, file.getString(request.getCharacterEncoding()));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else {
this.map.put(file.getFieldName(), file);
}
}
小弟文筆不過關,小小問題借用了大篇幅或許各位大蝦們也沒看明白。我的了解就是如果借用第三方包進行檔案上傳,盡量不要去手動指定編碼格式,在不同環境下可能編碼格式不一樣會出現亂碼。直接用擷取請求過來的編碼格式要好一些。歡迎大家指出其中的不足。