Jersey以异步方式处理多部分上传

时间:2018-02-23 14:05:07

标签: java multipartform-data jersey-2.0 dropwizard

我有一个文件CRUD rest API,客户端可以上传文件。这些文件可以大到1 GB。

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

也许这是HTTP的工作方式,但如果没有,我希望Jersey能够保持上传,直到我开始从FormDataMultiPart开始阅读,节省了大量精力和带宽。这可能吗?

当前代码:

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")时会失败。

1 个答案:

答案 0 :(得分:0)

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