如何处理服务器上的文件上传块(Plupload/Spring MVC)?

dnc*_*253 8 java spring file-upload chunking plupload

在我们的客户端上,可以上传大文件.我们希望使用分块来减少请求的大小.我们正在使用Plupload,所以很容易以块的形式发送文件.但是,我不知道如何处理这些块.我们在服务器上使用Spring MVC和我目前有我的控制器方法如下:uploadMedia(@RequestBody MultipartFile file)这里MultipartFile是org.springframework.web.multipart.MultipartFile.这样可以在不进行分块时正常工作.当我打开客户端的分块时,它仍然可以很好地进入这个方法,但是我没有看到传递的文件中的任何内容,它标识了chunk所属的文件.希望我只是遗漏了一些东西.

看起来这是一个常见的工作流程,但我似乎无法找到在服务器端如何完成这一任务的任何好例子.只有Spring的解决方案会很棒,但是如果需要另一个库,那也没关系.我看了一下Apache Commons FileUpload,但我在那里找不到任何有关分块的信息.对此的任何帮助都会很棒.谢谢.

dnc*_*253 8

我通过这个调试了一些,并添加了一个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)
Run Code Online (Sandbox Code Playgroud)

果然,这些@RequestParam参数分别填充了文件名,块数和块号(从零开始).在每个请求中包含此信息将使得将块组装到最终文件中变得非常容易.

还有一件事要知道,如果文件不需要分块(文件大小小于块大小),则不会发送chunks和chunk参数.所以,我的最终签名最终看起来像这样:

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

然后我可以检查-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);
    }
}
Run Code Online (Sandbox Code Playgroud)