我有一个接收上传文件的 servlet。我们一直遇到某个客户的请求没有附加文件或 servlet 认为的问题。上传 servlet 是旧 servlet 的替代品,我们使用 Apache Commons FileUpload 库从请求中解析文件。旧代码使用 JavaZoom 库。我们遇到问题的请求客户端在旧代码中工作得很好。
为了解决问题,我添加了一堆日志记录来查看请求标头和部分,以比较来自客户端的请求与不兼容的客户端的请求。这是我如何看待这些部分的片段:
Collection<Part> parts = request.getParts();
for(Part part : parts)
{
String partName = part.getName();
log.debug("Part=" + partName);
Collection<String> headerNames = part.getHeaderNames();
for(String headerName : headerNames)
{
String headerValue = part.getHeader(headerName);
log.debug(headerName + "=" + headerValue);
InputStream inputStream = part.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuilder builder = new StringBuilder();
try
{
for(String line=bufferedReader.readLine(); line!=null; line=bufferedReader.readLine())
{
builder.append(line);
builder.append('\n');
}
}
catch (IOException ignore)
{
// empty
}
finally
{
inputStream.reset();
}
log.debug("InputStream=" + builder.toString());
}
}
所有这些代码都可以正常工作,并且我得到了我期望的日志记录。但是,下一段代码没有按预期运行:
if (isMultipart)
{
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
@SuppressWarnings("rawtypes")
List items = null;
// Parse the request
try
{
items = upload.parseRequest(request);
log.debug("items=" + items);
}
catch (FileUploadException ex)
{
log.warn("Error parsing request", ex);
response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
}
记录时items
变量为空。如果我注释掉记录请求部分的代码,这段代码就可以工作,并且items
变量包含上传的文件。
我只能假设从请求中获取/读取部分的行为以某种方式将它们从中删除并且不再可用于进一步处理。是否有某种方法可以读取它们以用于记录目的,并且仍将它们保留在请求中以供进一步处理?