0

Java で再開可能なファイル アップロード システムを完全に実装しようとしています。私が使用しているライブラリは resumable.js で、ファイルのチャンクを送信して保存.partし、最後にそれらをマージします。リクエストを受け取ったら、メソッドPOSTでリクエストを受け取り、それを に保存してから、それを使用して必要なすべてのデータを取得します。ただし、ファイルを保存すると、ファイルが空になり、サイズが 0 バイトになります。doPostHttpServletRequestWrapper.part

確認したところ、データはすべて揃っているようですが、データを保存できないようです。私が間違って実装したものはありますか?

このタスクを実行するために使用するコードの小さなスニペットを次に示します。

public void doPost(HttpServletRequest request, HttpServletResponse response) {
    try {
        HttpServletRequestWrapper wrapReq = new HttpServletRequestWrapper(request);
        BufferedReader reader = wrapReq.getReader();
        /**
        * Get some data from the BufferedReader
        */
        if(ServletFileUpload.isMultipartContent(wrapReq)){
            File mkd = new File(temp_dir);
            if(!mkd.isDirectory())
                mkd.mkdirs();

            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            Iterator<FileItem> iter = upload.parseRequest(request).iterator();
            OutputStream out;

            out = new FileOutputStream(new File(dest_dir));
            while(iter.hasNext()){
                try {

                    FileItem item = iter.next();
                    IOUtils.copy(item.getInputStream(), out);                       
                    logger.debug("Wrote file " + resumableIdentifier + " with chunk number "
                            + resumableChunkNumber + " to " + temp_dir);
                    out.close();
                } catch (FileNotFoundException fnfe) {
                    fnfe.printStackTrace();
                }
            }
        }
        tryCreateFileFromChunks(temp_dir, resumableFileName, resumableChunkSize, resumableTotalSize);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

メソッドtryCreateFileFromChunks()は、すべてのパーツが存在するかどうかを確認し、それらをマージします。それは問題ではありません。.partファイル自体は空で保存されています。

それで、私はこれを間違った方法で処理しましたか?私はこれを正しく機能させるのに苦労してきました。

4

1 に答える 1

2

HttpServletRequestWrapperを使用したり、その を呼び出したりするべきではありませんgetReader()。リクエストの本文は一度だけ読み取ることができ、同じリクエストでメソッドを使用するか、メソッドを使用するか、またはメソッドを使用するかを選択する必要がありgetReader()それら getInputStream()混在させることはできません。 getParameterXxx()

Apache Commons FileUpload はgetInputStream()、要求本文を解析するために内部的に使用します。ただし、事前にgetReader()またはを呼び出した場合getParameterXxx()、Apache Commons FileUpload は空のリクエスト本文を取得します。

wrapReq結局のところ、問題を解決するには、完全に取り除くだけです。

if(ServletFileUpload.isMultipartContent(request)){
    // ...

以下も参照してください。

于 2013-01-27T20:31:55.063 に答える