Java 如何在服务器上处理文件上传块(Plupload/springmvc)?
在我们的客户机上,可以上载大型文件。我们希望使用分块来减少请求的大小。我们正在使用,因此很容易将文件分块发送。但是,我不确定如何处理这些块。我们在服务器上使用Spring MVC,我当前的控制器方法是:Java 如何在服务器上处理文件上传块(Plupload/springmvc)?,java,spring,file-upload,plupload,chunking,Java,Spring,File Upload,Plupload,Chunking,在我们的客户机上,可以上载大型文件。我们希望使用分块来减少请求的大小。我们正在使用,因此很容易将文件分块发送。但是,我不确定如何处理这些块。我们在服务器上使用Spring MVC,我当前的控制器方法是:uploadMedia(@RequestBody MultipartFile file)其中MultipartFile是org.springframework.web.multipart.MultipartFile。这在不进行分块时效果很好。当我在客户端打开分块时,它仍然可以很好地进入这个方法,但
uploadMedia(@RequestBody MultipartFile file)
其中MultipartFile
是org.springframework.web.multipart.MultipartFile
。这在不进行分块时效果很好。当我在客户端打开分块时,它仍然可以很好地进入这个方法,但是在传入的文件中,我看不到任何标识分块属于哪个文件的内容。希望我只是错过了一些东西
这似乎是一个常见的工作流,但我似乎找不到任何关于如何在服务器端实现这一点的好例子。只使用Spring的解决方案会很好,但如果需要另一个库,也可以。我看了一些,但我找不到任何关于在那里大块的东西。这方面的任何帮助都会很好。谢谢。我对此进行了更多的调试,并在我的控制器方法中添加了一个
HttpServletRequest
,以查看其中是否有可用的内容。我发现我收到的请求是一个org.springframework.web.multipart.support.defaultmultipartttpServletRequest
,它有一个名为multipartParameters
的字段,它只是一个HashMap
。我发现这个映射有name
、chunk
和chunk
键。因此,我决定尝试以下签名:
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)
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);
}
}
然后我可以检查-1,看看是否需要担心分块
因此,在控制器方法本身中,我有如下内容:
uploadMedia(@RequestBody MultipartFile file, @RequestParam String name, @RequestParam(required=false, defaultValue="-1") int chunks, @RequestParam(required=false, defaultValue="-1") int chunk)
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);
}
}
媒体=新媒体();
//在我的媒体对象上设置用于在数据库中存储文件信息的内容
//....
如果(块>0&&块>0)
{
//需要在此块中追加字节
mediaRepository.appendBytes(媒体,文件.getBytes());
if(chunk==chunks-1)
{
//最后一块,上传完成
ONUPLOAD(媒体);
}
}
其他的
{
//写出第一组字节
mediaRepository.saveBytes(媒体,文件.getBytes());
if(chunk)是否可以看到控制器的更多部分?我正在尝试实现相同的功能,并且正在与控制器的其余部分进行比较。我已经更新了答案,以包含更多的控制器代码。如果您不介意,您可以共享您的mediaRepository的一部分吗?它只是使用java 7()中的java.nio.file.Files包因此,上面的方法几乎是一行程序。Files.write(getFilePath(media),bytes,StandardOpenOption.CREATE);
和Files.write(getFilePath(media),bytes,StandardOpenOption.APPEND);
在发送到数据库之前,您是否将内容块写入临时文件?