使用jersey 2客户端上传文件:从FormDataParam的inputstream转换为File

时间:2019-03-08 09:10:31

标签: java rest jersey jersey-2.0 jersey-client

enter image description here

应用流程: 上图给出了使用其他应用程序REST API的应用程序的概念。假定每个框都由每个单独的REST应用程序公开REST API并使用其他应用程序API组成。 “ C ”是实际的端点,它公开了用于上传文件(.pdf)的API,并由应用程序B通过添加的验证和安全层使用。我的开发工作是针对“ A ”应用程序,除了使用公开的API之外,我对 B C 没有任何控制权B

我的开发任务:如上所述,我的任务之一是开发 A (REST应用),该API公开了API以上传带有一些附加业务逻辑的文件,以及将使用 B 应用程序的API,该API会实习生使用 C 应用程序上传文档。

Build.sbt

val jerseyVersion = "2.23.1"

libraryDependencies ++= Seq(
  "org.glassfish.jersey.containers" % "jersey-container-servlet" % jerseyVersion,
  "org.glassfish.jersey.media" % "jersey-media-multipart" % jerseyVersion,
  "org.glassfish.jersey.media" % "jersey-media-json-jackson" % jerseyVersion,
  "org.glassfish.jersey.ext" % "jersey-bean-validation" % jerseyVersion,
  "org.glassfish.jersey.core" % "jersey-server" % jerseyVersion,
  "org.glassfish.jersey.core" % "jersey-client" % jerseyVersion,
  "org.glassfish.jersey.containers" % "jersey-container-grizzly2-http" % jerseyVersion,
  "javax.servlet" % "javax.servlet-api" % "3.1.0",
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.8"
)

代码

@Path("/resource/document")
@Consumes({MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_JSON})
@Produces("application/json")
public Response<String> uploadDocument(@FormDataParam("empData") FormDataBodyPart empJson,
                                            @FormDataParam("source") String source,
                                            @FormDataParam("description") String description,
                                            @FormDataParam("file") InputStream uploadFileInputStream,
                                            @FormDataParam("file") FormDataContentDisposition fileMetaData){

    FormDataMultiPart multiPart = new FormDataMultiPart();

    final EmployeeDetails empDetails = empJson.getValueAs(EmployeeDetails.class);

    multiPart = multiPart.field("empData",empDetails.getName());
    multiPart = multiPart.field("country",empDetails.getCountry());

    multiPart = multiPart.field("source",source)
            .field("sourceDescription", description)
            .field("docDate", LocalDate.now().toString())
            .field("docLanguage","English")
            .field("recDate",LocalDate.now().toString())
            .field("additionalInformation",fileMetaData.getFileName())
            .field("docName",fileMetaData.getName());

    /*FormDataBodyPart bodyPart = new FormDataBodyPart("file",uploadFileInputStream.,MediaType.APPLICATION_OCTET_STREAM);*/
    return null;
} 

问题: 这是我第一次使用Jersey lib。从上面的代码中可以看到,我已经使用@FormDataParam("file") InputStream uploadFileInputStream来接收文件输入流,并且需要将其发送到应用程序 B 的api,该API负责其余的工作将文件上传到最终终点。但是,挑战在于如何将其发送到应用程序 B 的上载api。我不想将收到的InputStream存储到运行应用程序 A 的服务器位置的文件中,并创建一个File对象并发送它。有什么方法可以将此InputStream转换为File对象或任何其他对象,以便我可以使用jersey 2客户端将其发送到 B 应用程序的上载API。 让我知道是否需要任何其他信息或代码来帮助我解决问题。 只是一个注释。下面的代码并不完整,因为我被困在将InputStream转换为File并将其发送到B的上传API上。

技术堆栈

  

Java 8,   IntelliJ   SBT版本   球衣2

限制: 我正在使用jersey 2作为服务器和客户端,并且不能像代替jersey那样更改技术堆栈,不能使用Spring Boot或其他任何东西,我必须坚持使用jersey,但是我愿意使用任何版本的Jersey(jersey 1或球衣2)

0 个答案:

没有答案