天天看點

關于commons-fileupload解決(multipart/form-data)參數亂碼問題

今天做了一個檔案上傳功能。以前有過多次檔案上傳經驗結果這次确确實實把我難住了。

本次上傳借助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);
			}
		}
           

小弟文筆不過關,小小問題借用了大篇幅或許各位大蝦們也沒看明白。我的了解就是如果借用第三方包進行檔案上傳,盡量不要去手動指定編碼格式,在不同環境下可能編碼格式不一樣會出現亂碼。直接用擷取請求過來的編碼格式要好一些。歡迎大家指出其中的不足。