gpt4 book ai didi

java - ServletFileUpload#parseRequest(request) 返回一个空列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:14 27 4
gpt4 key购买 nike

我在 Android 中有一个客户端应用程序,它使用 HttpURLConnection 将文件发送到服务器。服务器使用 Apache Commons FileUpload API 来解析表单数据值。

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); 行中。返回的列表是空的,我无法获取表单数据值。

最佳答案

如果您事先已经(隐含地)解析了请求主体,那么此时它将为空。 HTTP 请求主体只能读取/解析一次(因为客户端只发送了一次,不会发送多次)。

当您将请求提供给 Commons FileUpload 之前调用以下任何方法时,将隐式读取/解析请求正文:

request.getParameter();
request.getParameterMap();
request.getParameterNames();
request.getParameterValues();
request.getReader();
request.getInputStream();

您需要绝对确保您没有事先调用任何这些方法(还要检查所有 servlet 过滤器以确保)。

如果你已经确定你没有这样做,那么唯一可能的原因就是边界标题不正确和/或使用不正确的换行符(它实际上必须是 CR+LF,因此不仅仅是 LF) .您可以在 Using java.net.URLConnection to fire and handle HTTP requests 的底部找到一个具体且适当的示例。 ,在“上传文件”部分下。

关于java - ServletFileUpload#parseRequest(request) 返回一个空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881272/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com