關於JSP Commons FileUpload 組件上傳檔案的一些總結

來源:互聯網
上載者:User

也許好東西就是需要慢慢地去發現和總結的.

以前我寫的JSP系統都是採用Jsp SmartUpload 組件來解決的.

前幾天客戶投訴說,上傳大檔案的時候,瀏覽器無反應,甚至會崩潰.叫我幫忙解決一下並加上上傳進度表示(這個暫且不表,有需要的可加我MSN:info@hkeb.com).

立即google ,baidu 一下,才知JSp SmartUpload 適用於比較小檔案的時候,而如果上傳大檔案的時候還得數commons FileUpload 組件.

在網上翻閱了無數篇關於這個東東的資訊. 基本上每一篇資訊都大同小異.這也難怪,網上的東西都是轉來轉去的.

上傳檔案是解決了,但是表單上的其他文本域參數卻不知道如何接收.直查得我頭破血流,費了一二周都沒解決.

因為全部的文章都沒有提到如何解決表單的其他文本資料.

直到今天才查得一個比較可行的辦法.

1:如果要傳參,資料量不是太大的話,可以用get 的帶參方法.即 form action 裡的upload.jsp後面跟上參數.

例如:upload.jsp?id=1&bid=2&uid=somebody

表單的類型不變.這樣在upload.jsp 處理上傳檔案資料之前可以用request.getParameter("id")來擷取參數.

這是一種在傳參的資料量不大的情況之下比較可行的方法.

2:如果確實沒有辦法,必須跟檔案域一起提交到上傳組件裡處理.據網友所說.可以採用如下代碼處理.

public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {
DiskFileUpload fileUpload = this.fileUpload;
String enc = determineEncoding(request);

// use prototype FileUpload instance if the request specifies
// its own encoding that does not match the default encoding
if (!enc.equals(this.defaultEncoding)) {
fileUpload = new DiskFileUpload();
fileUpload.setSizeMax(this.fileUpload.getSizeMax());
fileUpload.setSizeThreshold(this.fileUpload.getSizeThreshold());
fileUpload.setRepositoryPath(this.fileUpload.getRepositoryPath());
fileUpload.setHeaderEncoding(enc);
}

try {
List fileItems = fileUpload.parseRequest(request);
Map parameters = new HashMap();
Map multipartFiles = new HashMap();
for (Iterator it = fileItems.iterator(); it.hasNext();) {
FileItem fileItem = (FileItem) it.next();
if (fileItem.isFormField()) {
String value = null;
try {
value = fileItem.getString(enc);
}
catch (UnsupportedEncodingException ex) {
logger.warn("Could not decode multipart item '" + fileItem.getFieldName() +
    "' with encoding '" + enc + "': using platform default");
value = fileItem.getString();
}
String[] curParam = (String[]) parameters.get(fileItem.getFieldName());
if (curParam == null) {
// simple form field
parameters.put(fileItem.getFieldName(), new String[] { value });
}
else {
// array of simple form fields
String[] newParam = StringUtils.addStringToArray(curParam, value);
parameters.put(fileItem.getFieldName(), newParam);
}
}
else {
// multipart file field
CommonsMultipartFile file = new CommonsMultipartFile(fileItem);
multipartFiles.put(file.getName(), file);
if (logger.isDebugEnabled()) {
logger.debug("Found multipart file [" + file.getName() + "] of size " + file.getSize() +
    " bytes with original filename [" + file.getOriginalFilename() + "], stored " +
    file.getStorageDescription());
}
}
}
/***** 注意 parameters 就是普通的text之類的欄位的值 *****/
return new DefaultMultipartHttpServletRequest(request, multipartFiles, parameters);
}
catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(this.fileUpload.getSizeMax(), ex);
}
catch (FileUploadException ex) {
throw new MultipartException("Could not parse multipart request", ex);
}
}

使用方法是:

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
然後就能正常讀取參數:
multipartRequest.getParameter("xxx");

行不行,能不能擷取到,我沒有去驗證,有驗證成功的告知小弟一聲,不勝感激.

以上代碼的參考網址:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=16067&messageID=97803

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.