【问题标题】:quick "preview" of incoming multipart request传入多部分请求的快速“预览”
【发布时间】:2018-02-28 08:43:29
【问题描述】:

我正在尝试实现一个 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);

all freezes util 整个文件上传到服务器。

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

【问题讨论】:

  • 如果您对我的回答满意,请告诉我,如果不满意,我会很好奇它有什么问题。
  • 看起来不错@Z4,谢谢。我没有测试它(所以我不确定),因为我们选择以稍微不同的方式实现它,将文件拆分成更小的块(resumablejs.com),因为它允许更大的可扩展性和 AWS S3也支持它;)

标签: java spring rest tomcat servlet-3.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 上不会存储任何内容。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 2019-05-28
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多