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