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