在我们的客户端上,可以上传大文件。我们想使用分块来减少请求的大小。我们正在使用 Plupload ,因此很容易以 block 的形式发送文件。但是,我不确定如何处理这些 block 。我们在服务器上使用 Spring MVC,目前我的 Controller 方法有以下内容:uploadMedia(@RequestBody MultipartFile file)
其中 MultipartFile
是 org.springframework .web.multipart.MultipartFile
。这在不进行分块时工作得很好。当我在客户端打开分块时,它仍然可以很好地进入此方法,但我在传入的文件上看不到任何标识该 block 属于哪个文件的内容。希望我只是遗漏了一些东西。
这似乎是一个常见的工作流程,但我似乎找不到任何好的示例来说明如何在服务器端完成此操作。仅使用 Spring 的解决方案会很棒,但如果需要另一个库,那也很好。我看了一些 Apache Commons FileUpload ,但我在那里找不到任何关于分块的信息。任何帮助都会很棒。谢谢。
最佳答案
我对此进行了更多调试,并向我的 Controller 方法添加了一个 HttpServletRequest
以查看其中是否有可用的东西。我发现我收到的请求是 org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest
,它有一个名为 multipartParameters
的字段,它只是一个 HashMap
。我发现这张 map 有 name
、chunks
和 chunk
键。所以,我决定尝试以下作为我的签名:
uploadMedia(@RequestBody MultipartFile file, @RequestParam String name, @RequestParam int chunks, @RequestParam int chunk)
果然,那些 @RequestParam
参数分别填充了文件名、 block 数和 block 号(从零开始)。在每个请求中包含此信息将使将 block 组装到最终文件中变得非常容易。
还有一件事要知道,如果文件不需要分块(文件大小小于 block 大小),chunks
和 chunk
参数没有发送上去。所以,我最终的签名看起来像这样:
uploadMedia(@RequestBody MultipartFile file, @RequestParam String name, @RequestParam(required=false, defaultValue="-1") int chunks, @RequestParam(required=false, defaultValue="-1") int chunk)
然后我可以检查 -1 看看我是否需要担心分块。
所以,在 Controller 方法本身中,我有这样的东西:
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);
}
}
关于java - 如何处理服务器上的文件上传 block (Plupload/Spring MVC)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13466596/