アップロードされたファイルを受け取るサーブレットがあります。特定のクライアントのリクエストにファイルが添付されていない、またはサーブレットがそう判断するという問題が発生しています。アップロード サーブレットは古いものを置き換えるものであり、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
変数にはアップロードされたファイルが含まれます。
リクエストからパーツを取得/読み取るという行為により、何らかの形でパーツが削除され、それ以降の処理に使用できなくなったとしか思えません。ロギング目的でそれらを読み取り、さらに処理するためにリクエストに保持する方法はありますか?