我有一个接收上传文件的servlet。我们遇到了某个客户的请求没有附加文件或servlet认为的问题。上传servlet替代了旧的servlet,我们使用Apache Commons FileUpload库从请求中解析文件。旧代码使用JavaZoom库。我们遇到的请求客户端在旧代码中工作得很好。读取它们后丢失HttpServletRequest部件
为了解决问题,我添加了一堆日志记录来查看请求标头和部分,以比较来自客户端的请求与不支持的客户端的请求。这是我在看部件的一个片段:
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
变量是空的。如果我将用于记录请求部分的代码注释掉,则此位代码有效,并且变量包含上载的文件。
我只能假设从请求中获取/读取零件的行为以某种方式将它们从中移除并不再用于进一步处理。是否有某种方法可以将它们读取以用于日志记录,并仍将它们保留在进一步处理的请求中?