【问题标题】:Jersey handling multi-part upload asynchronouslyJersey 异步处理多部分上传
【发布时间】:2018-08-03 14:46:58
【问题描述】:

我有一个文件 CRUD REST API,客户端可以在其中上传文件。这些文件最大可达 1 GB。

我想做的是在开始上传之前对其他事情(可能还有文件名)进行一些验证。但是 Jersey 的 FormDataMultiPart 在开始处理请求处理程序之前等待完全上传。

也许这就是 HTTP 的工作方式,但如果不是,我希望 Jersey 保留上传,直到我开始阅读 InputStream,从而节省大量精力和带宽。这可能吗?

当前代码:

@PUT
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadFile(@NotNull FormDataMultiPart formDataMultiPart) {
    validateOtherThings(); // throws validation errors
    FormDataBodyPart formDataBodyPart = formDataMultiPart.getField("file");
    String filename = formDataBodyPart.getContentDisposition().getFileName();
    validateFilename(filename);
    InputStream inputStream = formDataBodyPart.getValueAs(InputStream.class);
    saveFile(filename, inputStream);
}

我试过了:

@PUT
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadFile(@Context HttpServletRequest request) {
    ...
    InputStream inputStream = request.getPart("file").getInputStream();
    ...
}

这实际上会立即进入方法,但在使用getPart("file")java.lang.IllegalStateException: No multipart config for servlet 时会失败。

【问题讨论】:

    标签: java multipartform-data jersey-2.0 dropwizard


    【解决方案1】:

    我不知道这是否可能。查看带有文件的示例 POST 请求:https://stackoverflow.com/a/23517227/158037 - 在创建 FormDataMultiPart 对象之前,Jersey 需要读取整个请求以了解存在哪些字段。 我想可以使用 Servlet (doPut()) 并使用 https://github.com/synchronoss/nio-multipart 之类的东西手动解析传入的数据,但我怀疑这是否值得。只需在客户端、发送前和服务器端、接收整个文件后进行验证。

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2014-01-30
      • 2013-10-08
      • 2016-11-06
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      相关资源
      最近更新 更多