9

私たちのクライアントでは、大きなファイルをアップロードすることが可能です。チャンクを使用してリクエストのサイズを減らしたいと思います。Pluploadを使用しているので、ファイルをまとめて送信するのは簡単です。ただし、チャンクの処理方法がわかりません。サーバーでSpringMVCを使用していますが、現在、コントローラーメソッドには次のものがあります。uploadMedia(@RequestBody MultipartFile file)ここで、MultipartFileorg.springframework.web.multipart.MultipartFileです。これは、チャンク処理を行わない場合でも問題なく機能します。クライアント側でチャンクをオンにしても、このメソッドには問題なく入りますが、渡されるファイルには、チャンクがどのファイルの一部であるかを識別するものは何も表示されません。うまくいけば、私は何かが足りないだけです。

これは一般的なワークフローのようですが、サーバー側でこれがどのように行われるかについての良い例を見つけることができないようです。Springだけのソリューションは素晴らしいでしょうが、別のライブラリが必要な場合はそれでも構いません。Apache Commons FileUploadをいくつか調べましたが、チャンクについては何も見つかりませんでした。これに関するどんな助けも素晴らしいでしょう。ありがとう。

4

1 に答える 1

10

これをさらにデバッグし、コントローラーメソッドにを追加しHttpServletRequestて、そこに利用可能なものがあるかどうかを確認しました。私が受け取ったリクエストorg.springframework.web.multipart.support.DefaultMultipartHttpServletRequestは、というフィールドがあり、multipartParametersこれは単なる。であることがわかりましたHashMap。このマップには、、、およびのキーがあることがわかりnameましchunkschunk。そこで、署名として次のことを試してみることにしました。

uploadMedia(@RequestBody MultipartFile file, @RequestParam String name, @RequestParam int chunks, @RequestParam int chunk)

案の定、これらの@RequestParamパラメーターには、ファイルの名前、チャンクの数、およびチャンクの数(ゼロベース)がそれぞれ入力されています。リクエストごとにこの情報があると、チャンクを最終ファイルにアセンブルするのが非常に簡単になります。

また、ファイルをチャンク化する必要がない場合(ファイルサイズがチャンクサイズよりも小さい場合)、chunksおよびchunkパラメーターは送信されないことも知っておく必要があります。したがって、私の最終的な署名は次のようになりました。

uploadMedia(@RequestBody MultipartFile file, @RequestParam String name, @RequestParam(required=false, defaultValue="-1") int chunks, @RequestParam(required=false, defaultValue="-1") int chunk)

次に、-1をチェックして、チャンク化についてまったく心配する必要があるかどうかを確認できます。

したがって、コントローラーメソッド自体には次のようなものがあります。

Media media = new Media();
//set stuff on my Media object for storing info about the file in the DB
//....
if (chunks > 0 && chunk > 0)
{
    //Need to append the bytes in this chunk
    mediaRepository.appendBytes(media, file.getBytes());
    if (chunk == chunks - 1)
    {
        //last chunk, upload is done
        onUploadFinished(media);
    }
}
else
{
    //Write out the first set of bytes
    mediaRepository.saveBytes(media, file.getBytes());
    if (chunks <= 0)
    {
        //no chunks were needed, all the bytes have been written out, upload is done
        onUploadFinished(media);
    }
}
于 2012-11-20T06:22:22.843 に答える