当前位置: 首页 > 知识库问答 >
问题:

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

许嘉福
2023-03-14

这里有很多链接建议使用多部分/表单数据,以及如何在这里上传文件。对于通过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柱“http://localhost:37200/api/sample-批量“-H”接受:应用程序/json“-H”内容类型:多部分/表单数据“-F”文件=@/Users/naman/Desktop/Media/video。mp4;类型=视频/mp4“

但它会导致服务中的多部分(multiPart)被设置为空(null),当然还有NPE。

有什么我错过的愚蠢的事吗?

共有3个答案

齐栋
2023-03-14

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

Curl-X POST"http://localhost:37200/api/sample-bulk"-H"接受:应用程序/json"-H"Content-Type: multipart/form-data"-F"file=@/User/naman/Desktop/Media/video.mp4"-F"type=video/mp4"

邢和光
2023-03-14
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-14

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

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

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

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

每个部分都有自己的名称,您使用该名称提取部分。在cURL请求的情况下,您发送了一个部分,该部分的名称是file。即"file=@/User/..."。因此,如果您想发送另一个部分,只需添加另一个具有不同名称的参数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获取有关该部件的信息,例如文件名。

  • 为什么不同地对待“FormDataMultiPart”类型参数

>

  • 零件也可以有相同的名称,例如。

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

    这就是为什么当您尝试以编程方式获取零件时,会得到一个FormDataBodyParts列表,而不是一个对象,即

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

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

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

  •  类似资料:
    • 我在Jersey写了一个Rest服务来上传多个文件。如下图所示。但是我需要Restservice类中的属性名,即name=“metadata”和name=“file”。 选择XML文件1: 选择PDF文件2: FormDataContentDisposition仅从表单中提取内容类型、文件名,而不是输入类型名称=“属性。 任何帮助都将不胜感激。 我张贴使用超文本标记语言的请求如下所示。 也发布HT

    • 我是web服务新手,正在开发一个文档管理系统,并尝试使用Jersey restful web服务保存文件和多个对象。 我的网站。xml 运行此服务后,我面临以下错误 项目库是 所以,我找不到任何解决方案,是否有任何不同的方法可以通过一个rest调用上载具有多个对象的文件。 请在这方面指导我。

    • 我运行一个简单的后端应用程序,允许上传文件。我使用泽西岛并在码头运行它。我的代码部分如下所示: 上传工作正常,但我发现该方法是在整个流上传到后端时调用的。因此,例如,如果我发送大文件(要上传3Gigs),我的POST请求会立即出现在后端,但只有当整个3Gigs通过网络上传时才会调用上面的方法。 我想在方法中进行一些检查,并且在某些情况下不上传文件,因此它不需要将整个内容传递到后端,然后将错误消息发

    • 我需要使用泽西2.0创建一个ReST服务。我需要向客户端发送多个文档和元数据。实现这一点的最佳方法是什么。 我能够从服务器发送一个多部分响应,但是不知道如何从客户端代码中读取它

    • 我正在创建一个API上传文件使用泽西。 } } 当我执行curl-v-X POST时——form file=@rt.txt url 我哪里做错了?

    • 我对web服务非常陌生。我已经公开了一些使用与Spring集成的Jersey 2的REST服务。现在我需要使用用户名/密码身份验证来保护那些rest服务。我被告知不要使用Spring Security。 我不知道该怎么做。我确实在网上搜索了一下,但是各种链接显示了不同的实现方式,我无法决定如何进行。