js|上傳
也許好東西就是需要慢慢地去發現和總結的.
以前我寫的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");
行不行,能不能擷取到,我沒有去驗證,有驗證成功的告知小弟一聲,不勝感激.