使用SpringMVC在Java中上传分块文件?
在我的项目中,我被指派开发一个可以处理要上传的大型文档的代码。文档可以是pdf、图像等。我需要获取此文件并将其保存在数据库中。客户端将React,React将以块的形式发送数据。后端代码是用Java和SpringMVC编写的。目前,它没有将其作为块发送,这会导致浏览器内存问题 基本情况是,用户将上传一个大小为200 MB的大文件,前端将把它作为小包发送到后端ie,作为块 现在不管我们有什么使用SpringMVC在Java中上传分块文件?,java,spring,spring-mvc,file-upload,chunking,Java,Spring,Spring Mvc,File Upload,Chunking,在我的项目中,我被指派开发一个可以处理要上传的大型文档的代码。文档可以是pdf、图像等。我需要获取此文件并将其保存在数据库中。客户端将React,React将以块的形式发送数据。后端代码是用Java和SpringMVC编写的。目前,它没有将其作为块发送,这会导致浏览器内存问题 基本情况是,用户将上传一个大小为200 MB的大文件,前端将把它作为小包发送到后端ie,作为块 现在不管我们有什么 @RequestMapping(value = "/intake/{channel}/attachment
@RequestMapping(value = "/intake/{channel}/attachment", method = RequestMethod.POST)
@ResponseBody
public JsonResponse uploadAttachment(final MultipartHttpServletRequest request,
@PathVariable(name = "xxxx") String xxxxx, final HttpSession session,
@RequestParam(name = "xxxxx", required = false, defaultValue = "") String xxxxx,
@RequestParam(name = "xxxxxx", required = false, defaultValue = "") String xxxxxx,
@RequestParam(name = "unzip", required = false, defaultValue = "true") boolean unzip,
@RequestParam(name = "xxx",required = false) String xxx) {
JsonResponse jsonResponse = new JsonResponse();
List<String> docsetIds = new ArrayList<>();
List<String> parentDocsetIds = new ArrayList<>();
WorklistActionResponse response = null;
boolean isLiterature = false;
try {
List<MultipartFile> files = request.getFiles("attachment");
if (files != null) {
String rootURL = CommonUtils.getRootURL(request);
for (Iterator iterator = files.iterator(); iterator.hasNext();) {
MultipartFile multipartFile = (MultipartFile) iterator.next();
FileContent fileContent = new FileContent();
fileContent.setContentLength(multipartFile.getSize());
fileContent.setContentType(multipartFile.getContentType());
fileContent.setInputStream(multipartFile.getInputStream());
fileContent.setName(multipartFile.getOriginalFilename());
String filePath = multipartFile.getOriginalFilename();
String filePathParts[] = filePath.split("/");
String fileName = filePathParts[filePathParts.length - 1];
String fileParts[] = fileName.split("\\.");
String fileExtension = fileParts[fileParts.length - 1];
fileContent.setFileExtention(fileExtension);
DocumentDetail subDocumentDetail = documentService.saveAttachment(
new NewAttachmentRequest(channel, groupId, rootURL, docsetId, fileContent), userId);
if (subDocumentDetail == null) {
throw new NotSupportedException();
}
if (subDocumentDetail != null) {
subDocumentDetails.add(subDocumentDetail);
}
}
}
}
}
@RequestMapping(value=“/inctain/{channel}/attachment”,method=RequestMethod.POST)
@应答器
public JsonResponse uploadAttachment(最终MultipartTTpServletRequest请求,
@PathVariable(name=“xxxx”)字符串xxxxx,最终HttpSession会话,
@RequestParam(name=“xxxxx”,required=false,defaultValue=“”)字符串xxxxx,
@RequestParam(name=“xxxxxx”,required=false,defaultValue=“”)字符串xxxxxx,
@RequestParam(name=“unzip”,required=false,defaultValue=“true”)布尔解压,
@RequestParam(name=“xxx”,required=false)字符串xxx){
JsonResponse JsonResponse=新的JsonResponse();
List docsetid=new ArrayList();
List parentDocsetId=new ArrayList();
WorklistActionResponse=null;
布尔isLiterature=false;
试一试{
列表文件=request.getFiles(“附件”);
如果(文件!=null){
字符串rootURL=CommonUtils.getRootURL(请求);
for(Iterator Iterator=files.Iterator();Iterator.hasNext();){
MultipartFile MultipartFile=(MultipartFile)迭代器.next();
FileContent FileContent=新的FileContent();
setContentLength(multipartFile.getSize());
fileContent.setContentType(multipartFile.getContentType());
setInputStream(multipartFile.getInputStream());
fileContent.setName(multipartFile.getOriginalFilename());
字符串filePath=multipartFile.getOriginalFilename();
字符串filePathParts[]=filePath.split(“/”);
字符串fileName=filePathParts[filePathParts.length-1];
字符串fileParts[]=fileName.split(“\\”);
字符串fileExtension=fileParts[fileParts.length-1];
setFileExtension(fileExtension);
DocumentDetail子DocumentDetail=documentService.saveAttachment(
新的NewAttachmentRequest(频道、组ID、根URL、文档集ID、文件内容)、用户ID);
if(subDocumentDetail==null){
抛出新的NotSupportedException();
}
if(子文档详细信息!=null){
子文档详细信息。添加(子文档详细信息);
}
}
}
}
}
在此,文档将通过多部分请求接收。此代码不适用于此目的
我的问题是:
1,多部分请求是否足以处理分块数据
2、当数据进入数据块时,我必须进行哪些修改/更改?即,小数据包将持续出现,直到上传完成
我在堆栈溢出中找到了一些类似的答案
但我可以在堆栈溢出本身中看到许多与这些相反的语句
如何解决此问题?据我所知,
multipartttpServletRequest
没有处理此类请求的现成功能,您需要自己通过计算大小和文件结束检测来编码,通过扩展类或自定义输入流代码相反,您可以使用websocket解决问题,如果您的react真的能够将200MB的文件拆分为Blob,那么您可以通过websocket发送它,并使用自定义代码在服务器上组合它,您可以高效地在前面显示进度条end@DickensASA S-你能详细说明你的第一个评论吗?嗨,默认情况下,多部分上传提供的设施,其目标与你的预期不同,传输编码:HTTP请求的分块
没有得到multipartttpServletRequest
Hi@DickensAS的良好定义和支持,那么我该如何实现这一点呢?据我所知,multipartttpServletRequest
没有处理此类请求的现成功能,您需要自己编写代码,通过计算大小和文件结尾检测,或者通过扩展类或自定义输入流代码。相反,您有websocket的解决方案,如果您的react真的能够将200MB的文件拆分为Blob,您可以通过websocket发送它,并使用自定义代码在服务器上组合它,您可以高效地在前面显示进度条end@DickensASA S-你能详细说明你的第一个评论吗?嗨,默认情况下,多部分上传提供的设施,其目标与你的预期不同,Transfer Encoding:HTTP请求的chunked
没有得到multipathttpservletrequest
Hi@DickensAS的良好定义和支持,那么如何实现这一点呢?