0

アップロードされたファイルを受け取るサーブレットがあります。特定のクライアントのリクエストにファイルが添付されていない、またはサーブレットがそう判断するという問題が発生しています。アップロード サーブレットは古いものを置き換えるものであり、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変数にはアップロードされたファイルが含まれます。

リクエストからパーツを取得/読み取るという行為により、何らかの形でパーツが削除され、それ以降の処理に使用できなくなったとしか思えません。ロギング目的でそれらを読み取り、さらに処理するためにリクエストに保持する方法はありますか?

4

1 に答える 1

2

は、のCollection<Part> parts = request.getParts();代わりとなるSevlet3.0APIですCommons Apache File Upload API

2つの方法のうち1つだけを使用する必要があります。どちらも、アップロードされたファイルとパラメータを一緒に処理するためのサポートがあります。

サーブレット3.0を使用したファイルアップロードの例を次に示します。

あなたが直面している問題は、あなたがこのCollection<Part> parts = request.getParts(); リクエストを呼び出しているので、リクエスト入力ストリームを消費するからです。次に、ApacheCommonsAPIを使用してパーツを再度読み取ります。ストリームはすでに読み取られているため、使用可能なパーツがないことがわかります。

サーブレット3.0ファイルアップロードのリファレンス:

于 2012-07-10T05:01:45.530 に答える