我在Android中有一個客戶端應用程序,它使用HttpURLConnection
將文件發送到服務器。服務器使用Apache Commons FileUpload API來解析表單數據值。ServletFileUpload#parseRequest(request)返回一個空的列表
的HttpURLConnection
發送該請求:
-----------------------------4912995119421
Content-Disposition: form-data; name="deviceid"
9428103
-----------------------------4912995119421
Content-Disposition: form-data; name="countryid"
598
-----------------------------4912995119421
Content-Disposition: form-data; name="number"
98621360
-----------------------------4912995119421
Content-Disposition: form-data; name="file"; filename="2012-12-08 17.42.18.jpg"
Content-Type: image/jpeg
ÿØÿá1 Exif II*
@ ° ª
² ¼ Ä ( 1 Ì 2 Ø i‡ ì %ˆ \ n SAMSUNG GT-S5360L H H S5360LUHLB1 2012:12:08 17:42:18 š‚ î ?‚ ö "ˆ 'ˆ È ? 0220? þ ? ‘ ’ & ’
’ . 0100 @ ° > £ ¤ ¤ ¤ 6 ¤
2012:12:08 17:42:18 2012:12:08 17:42:18
d R98 0100 ( ¤ T. ÿØÿà JFIF ÿÛ C @@ÿÛ
-----------------------------4912995119421--
服務器代碼:
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") == -1)) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
long maxFileSize = (2 * 1024 * 1024);
int maxMemSize = (2 * 1024 * 1024);
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax(maxFileSize);
List fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
//leo primero todas las variables.
int deviceID = 0;
int countryID = 0;
String phoneNumber = "";
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (fi.isFormField()) {
String variable = fi.getFieldName();
if (variable.equals("deviceid")) {
deviceID = Integer.parseInt(fi.getString());
} else if (variable.equals("countryid")) {
countryID = Integer.parseInt(fi.getString());
} else if (variable.equals("number")) {
phoneNumber = String.valueOf(Long.parseLong(fi.getString()));
}
}
}
if (deviceID == 0 || countryID == 0 || phoneNumber.equals("")) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
的問題是在該行List fileItems = upload.parseRequest(request);
。 返回的列表是空的,我無法獲取表單數據值。
我檢查使用:request.getInputStream() byte [] a = new byte [8096]; int r = 0; ServletInputStream s = request.getInputStream(); String c =「」; ((r = s.read(a))!= -1)c + = new String(a).substring(0,r); } 並收到數據ok。 問題是commond文件上傳不能解析內容。 – toto
那麼,如果你刪除'request.getInputStream()'調用,那麼它應該可以正常工作,正如我的答案中所解釋的那樣。 – BalusC
好吧,我假設你沒有事先調用任何提及的方法。這個問題只能意味着你沒有設置正確的邊界標題,或者你使用了錯誤的換行符。您可以在http://stackoverflow.com/a/2793153底部的「上傳文件」部分找到一個具體且恰當的示例。 – BalusC