使用SpringMVC在Java中上传分块文件?

使用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

在我的项目中,我被指派开发一个可以处理要上传的大型文档的代码。文档可以是pdf、图像等。我需要获取此文件并将其保存在数据库中。客户端将React,React将以块的形式发送数据。后端代码是用Java和SpringMVC编写的。目前,它没有将其作为块发送,这会导致浏览器内存问题

基本情况是,用户将上传一个大小为200 MB的大文件,前端将把它作为小包发送到后端ie,作为块

现在不管我们有什么

@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的良好定义和支持,那么如何实现这一点呢?