使用Jersey在REST服务中上传多个文件

时间:2019-07-09 13:49:17

标签: java curl jersey jax-rs multipartform-data

此处有一些链接建议使用multipart/form-data以及如何在此处上传文件。对于通过CURL命令上传到接收FormDataMultiPart的REST服务的多个文件的组合,实际上找不到一个。

当前服务中的代码如下:

@javax.ws.rs.POST
@javax.ws.rs.Path("/sample-bulk")
@javax.ws.rs.Consumes(javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA)
public javax.ws.rs.core.Response bulkUpload(@FormDataParam("file") org.glassfish.jersey.media.multipart.FormDataMultiPart multiPart) {
    log.info("{} log", multiPart.getField("file"));
    return Response.ok().build();
}

我尝试调用该服务的CURL为:

  

卷曲-X POST   “ http://localhost:37200/api/sample-bulk”   -H“接受:应用程序/ json” -H“内容类型:多部分/表单数据” -F“文件= @ /用户/ naman /桌面/媒体/video.mp4;类型=视频/ mp4”

但这会导致multiPart在服务中心null当然是NPE。

我在这里错过了任何愚蠢的事情吗?

3 个答案:

答案 0 :(得分:2)

问题出在方法参数上(@FormDataParam的存在)

public Response bulkUpload(@FormDataParam("file") FormDataMultiPart multiPart) {}

@FormDataParam用于从多部分请求中声明性地提取单个部分,而FormDataMultiPart用于获取整个多部分主体并以编程方式< / em>提取每个部分。 It's possible具有嵌套的多部分,其中完整的多部分是一个单独的部分(在这种情况下,您可以使用的部分),但是这里不是这种情况。

如果您删除@FormDataParam("file"),则它将按预期工作。您可以使用getField(fieldName)的方法开始从多部分中提取部分。这将为您提取的每个部分提供FormDataBodyPart。如果希望将该部分作为FormDataBodyPart#getValueAs(InputStream.class),则可以使用InputStream获取数据,也可以使用File.classbyte[].class,无论您喜欢什么。这是从FormDataMultiPart中提取数据的方法。

每个部分都有其自己的名称,然后使用该名称提取该部分。对于您的cURL请求,您发送了一部分,该部分的名称为file。即"file=@/Users/..."。因此,如果要发送另一部分,只需添加另一个名称as mentioned by Vladimir

curl -X POST "http://localhost:37200/api/sample-bulk"\
     -H "accept: application/json"\
     -H "Content-Type: multipart/form-data"\
     -F "file1=@/Users/naman/Desktop/Media/video.mp4"\
     -F "file2=@/Users/naman/Desktop/Media/another_video.mp4"

正如我之前提到的,@FormDataParam用于声明性提取部分。您可以使用零件名称作为注释值。因此,使用前面的cURL命令,您可以做到。

public Response bulkUpload(
        @FormDataParam("file1") InputStream file1,
        @FormDaraParam("file1") FormDataContentDisposition file1Fdcd,
        @FormDataParam("file2") InputStream file2,
        @FormDaraParam("file2") FormDataContentDisposition file2Fdcd) {
}

您可以从FormDataContentDisposition获取有关零件的信息,例如文件名。

另请参见

答案 1 :(得分:1)

Use this parameter 

public Response uploadFile(@FormDataParam("files") List<FormDataBodyPart> file) 

Use for loop

 for (int j = 0; j < files.size(); j++) {
   FormDataBodyPart this_formDataBodyPartFile = files.get(j);
   ContentDisposition this_contentDispositionHeader = this_formDataBodyPartFile
                                                    .getContentDisposition();
   InputStream this_fileInputStream = this_formDataBodyPartFile.getValueAs(InputStream.class);
                                            FormDataContentDisposition fileDetail = (FormDataContentDisposition) this_contentDispositionHeader;

//Write the code upload code   }

答案 2 :(得分:0)

尝试对每个多部分条目使用单独的-F标志,诸如此类:

  

卷曲-X POST   “ http://localhost:37200/api/sample-bulk”   -H“接受:应用程序/ json” -H“内容类型:多部分/表单数据” -F“文件= @ /用户/ naman /桌面/媒体/video.mp4” -F“类型=视频/ mp4”