快速"预览"传入的多部分请求

时间:2018-02-28 08:43:29

标签: java spring rest tomcat servlet-3.0

我试图实现一个REST服务(甚至是一个Servlet),这将使我能够快速预览"传入文件(包含单个文件的多部分请求)。

我们的想法是在数据库中解析和存储很少的第一行潜在巨大文件。

我面临的问题是Spring @RestController(在Tomcat上)在服务器收到整个请求并且MultipartFile已经存储在文件系统上之后运行。

我设法实现了一些与纯Servlet实现一起工作的东西(直接从HttpServletRequest读取多部分请求)但是......然后我需要手动完成所有的多部分解析。我尝试使用commons fileupload(http://commons.apache.org/proper/commons-fileupload/),但它也在文件系统上缓存文件,所以当我打电话时:

        List<FileItem> uploads = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);

所有freezes util整个文件都上传到服务器上。

如何处理这个问题的任何建议 - 最好是在Tomcat和@RestController上,如果可能的话。

1 个答案:

答案 0 :(得分:1)

我相信你在commons-fileupload的正确轨道上。您只需使用"streaming" API即可。类似的东西应该有效:

@RestController
public class ARestController {
    @RequestMapping(value = Routes.A_ROUTE, method = RequestMethod.POST)
    public ResponseEntity<?> processMultiPart(HttpServletRequest request) {
        try {
            ServletFileUpload upload = new ServletFileUpload();
            final FileItemIterator itemIterator = upload.getItemIterator(request);

            while (itemIterator.hasNext()) {
                final FileItemStream fileItemStream = itemIterator.next();
                if (!fileItemStream.isFormField()) {
                    try (InputStream inputStream = fileItemStream.openStream()) {
                        // process the stream the way you want
                    }
                }
            }
        } catch (Exception e) {
            // ...
        }
    }
}

通过这种方式,您可以将这些部分作为流读取,使用您需要的任何内容,并丢弃其余部分。 FS上不会存储任何内容。