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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速“预览”传入的多部分请求相关的知识,希望对你有一定的参考价值。

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

所有冻结的util整个文件都上传到服务器上。

任何建议如何处理 - 最好是在Tomcat和@RestController,如果它是可能的。

答案

我相信你在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上不会存储任何内容。

以上是关于快速“预览”传入的多部分请求的主要内容,如果未能解决你的问题,请参考以下文章

Jersey API中的多部分/表单数据出现CORS错误

在android中动态创建选项卡并使用传入的参数加载片段

RestFramework

如何在颤动的多部分请求中发送对象列表?

片段中的 Android 相机预览

rest_framework