Servlets 读取HttpServletRequest部件后将其丢失
我有一个servlet,它接收上传的文件。我们遇到了一些问题,比如某个客户端的请求没有附加文件,或者servlet认为是这样。upload servlet是旧servlet的替代品,我们使用ApacheCommonsFileUpload库解析请求中的文件。旧代码使用JavaZoom库。我们遇到问题的请求客户端在旧代码中工作得非常好 为了解决这个问题,我添加了一系列日志来查看请求头和部分,以比较来自工作客户端和不工作客户端的请求。这是我如何看待这些部分的一个片段:Servlets 读取HttpServletRequest部件后将其丢失,servlets,java-ee-6,httprequest,multipartform-data,Servlets,Java Ee 6,Httprequest,Multipartform Data,我有一个servlet,它接收上传的文件。我们遇到了一些问题,比如某个客户端的请求没有附加文件,或者servlet认为是这样。upload servlet是旧servlet的替代品,我们使用ApacheCommonsFileUpload库解析请求中的文件。旧代码使用JavaZoom库。我们遇到问题的请求客户端在旧代码中工作得非常好 为了解决这个问题,我添加了一系列日志来查看请求头和部分,以比较来自工作客户端和不工作客户端的请求。这是我如何看待这些部分的一个片段: Collection<Pa
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());
}
}
items
变量在记录时为空。如果我注释掉用于记录请求部分的代码,那么这段代码有效,items
变量包含上传的文件
我只能假设,从请求中获取/读取部分的行为以某种方式将它们从请求中移除,并且不再可用于进一步处理。是否有某种方法可以读取它们以用于日志记录,并且仍然将它们保留在请求中以供进一步处理?收集部件=请求.getParts()是一个Sevlet 3.0 API,它取代了Commons Apache File Upload API
您应该只使用这两种方法中的一种。两者都支持处理上传的文件和参数
下面是一个例子
您面临的问题是因为您正在调用此Collection parts=request.getParts()代码>请求将使用请求输入流。然后使用ApacheCommonsAPI再次阅读这些部分。因为流已经被读取,所以您看到没有可用的部分
Servlet 3.0文件上传参考:
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());
}