为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

皈依舞 2023-03-17 15:22:45
这里有很多链接建议使用multipart/form-data以及如何在此处上传文件。对于通过 CURL 命令上传到 REST 服务并接受FormDataMultiPart.目前服务中的代码如下所示:@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 如下:curl -X POST " http://localhost:37200/api/sample-bulk " -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@/Users/ naman/Desktop/Media/video.mp4;type=video/mp4"但它会导致multiPart服务null,当然还有 NPE。我在这里错过了什么愚蠢的事情吗?
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

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


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

@FormDataParam当您想以声明方式从多部分请求中提取各个部分时使用,而FormDataMultiPart用于获取整个多部分正文并以编程方式提取每个部分。可以有一个嵌套的多部分,其中一个完整的多部分是一个单独的部分(在这种情况下你可以使用),但这里不是这种情况。


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


每个部分都有自己的名称,您可以使用该名称提取部分。对于您的 cURL 请求,您发送了一个部分,该部分的名称是file. 即"file=@/Users/..."。因此,如果您想发送另一部分,只需添加另一个名称不同的参数1,如 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. 零件也可以有相同的名称,例如

    -F file=@path_to_file1-F file=@path_to_file2

    这就是当您尝试以编程方式获取零件时,您得到的是 FormDataBodyParts 列表而不是单个对象的原因,即

    FormDataMultiPart multiPart = ...
    List<FormDataBodyPart> files = multiPart.getField("file");

    而且,如果您想以声明方式获取它们,则可以使用 aList而不是单个对象类型

    public Response upload(@FormDataParam("file") List<InputStream> files) { ... }


查看完整回答
反对 回复 2023-03-17
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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   }


查看完整回答
反对 回复 2023-03-17
?
达令说

TA贡献1821条经验 获得超6个赞

尝试为每个多部分条目使用单独的 -F 标志,例如:

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


查看完整回答
反对 回复 2023-03-17
  • 3 回答
  • 0 关注
  • 262 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号