有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java快速“预览”传入的多部分请求

我正在尝试实现一个REST服务(甚至是一个Servlet),它将允许我快速“预览”传入文件(包含单个文件的多部分请求)

其想法是解析并在DB中存储进入服务的潜在巨大文件的几行

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

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

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

所有文件都上传到服务器上

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


共 (1) 个答案

  1. # 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上不会存储任何内容