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

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

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

我通过这个调试了一些,并在我的控制器方法中添加了一个HttpServletRequest,以查看是否有任何可用的东西.我发现我收到的请求是org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest,它有一个名为multipartParameters的字段,它只是一个HashMap.我发现这张地图上有名字,块和块的键.所以,我决定尝试以下作为我的签名:

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

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

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

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);
    }
}
相关文章
相关标签/搜索