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

标签 java spring file-upload plupload chunking

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

这似乎是一个常见的工作流程,但我似乎找不到任何好的示例来说明如何在服务器端完成此操作。仅使用 Spring 的解决方案会很棒,但如果需要另一个库,那也很好。我看了一些 Apache Commons FileUpload ,但我在那里找不到任何关于分块的信息。任何帮助都会很棒。谢谢。

最佳答案

我对此进行了更多调试,并向我的 Controller 方法添加了一个 HttpServletRequest 以查看其中是否有可用的东西。我发现我收到的请求是 org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest,它有一个名为 multipartParameters 的字段,它只是一个 HashMap。我发现这张 map 有 namechunkschunk 键。所以,我决定尝试以下作为我的签名:

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

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

还有一件事要知道,如果文件不需要分块(文件大小小于 block 大小),chunkschunk参数没有发送上去。所以,我最终的签名看起来像这样:

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/

相关文章:

jsp - 如何在jsp和servlet中显示文件上传进度条并实现多部分过滤器?

java - 我需要一个基本的简单Java布局方法

java - 如何在 Thymeleaf 中动态替换片段?

java - 从单个数据库中通过 id AND St​​ring 获取数据

python - 如何在 Python Mechanize 中发布文件,但没有任何形式?

android - 如何从android内存中选择一个文件对其进行一些操作

java - 将 doc 转换为 pdf

java - 获取监听器类以更改 Controller 中标签的值

java - 是什么导致了这个方法中的异常? java.lang.OutOfMemory错误: Java heap space

java - Spring Integration 消息驱动 channel 适配器标签不支持 bean 名称?