ServletFileUpload#parseRequest(request) 返回一个空列表 [英] ServletFileUpload#parseRequest(request) returns an empty list
问题描述
我在 Android 中有一个客户端应用程序,它使用 HttpURLConnection
将文件发送到服务器.服务器使用 Apache Commons FileUpload API 来解析表单数据值.
I have a client application in Android which uses HttpURLConnection
to send files to the server. The server uses the Apache Commons FileUpload API to parse the form-data values.
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);
这一行.返回的列表为空,我无法获取表单数据值.
The problem is in the line List fileItems = upload.parseRequest(request);
.
The returned list is empty and I can not get the form-data values.
推荐答案
如果您事先已经(隐式地)解析了请求正文,那么此时它将为空.HTTP 请求正文可以仅被读取/解析一次(因为客户端只发送了一次,不会多次发送).
It will be empty at that point if you have already (implicitly) parsed the request body beforehand. The HTTP request body can be read/parsed only once (as the client has sent it only once and won't send it multiple times).
当您在将请求提供给 Commons FileUpload 之前调用以下任何方法时,请求正文将被隐式读取/解析:
The request body will be implicitly read/parsed when you have invoked any of the following methods before feeding the request to Commons FileUpload:
request.getParameter();
request.getParameterMap();
request.getParameterNames();
request.getParameterValues();
request.getReader();
request.getInputStream();
您需要确保事先不调用任何这些方法(还要检查所有 servlet 过滤器以确保).
You need to make absolutely sure that you are not calling any of those methods beforehand (also check all servlet filters to be sure).
如果您已经确保没有这样做,那么唯一可能的原因是边界标题不正确和/或使用了不正确的换行符(它确实必须是 CR+LF,因此不仅仅是 LF).您可以在 使用 java.net.URLConnection 来触发和处理 HTTP 请求,在上传文件"部分下.
If you've already ensured that you aren't doing that, then the only other possible causes would be an incorrect boundary header and/or using incorrect newlines (it has really to be CR+LF and thus not alone LF). You can find a concrete and proper example at the bottom of Using java.net.URLConnection to fire and handle HTTP requests, under the section "Uploading files".
这篇关于ServletFileUpload#parseRequest(request) 返回一个空列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!