Jersey REST客户端 - 多部分创建 - 不是来自File对象

时间:2017-09-12 09:53:18

标签: java rest jersey client multipart

我猜没有其他方法可以创建FileDateBodyPart而不是提供File对象:

public FileDataBodyPart(String name, File fileEntity)

但在我的情况下,我所拥有的是一个byte [],我不想将其转换为文件并存储在文件系统上。

在使用其他客户端库的最坏情况下,是否还有其他方法可以从字节,输入流数组中生成多部分(在上传文件时)?

更新: 这是工作代码(但我想使用byte []而不是File):

FileDataBodyPart filePart = new FileDataBodyPart("attachment", new File("C:/TEMP/test.txt"));
MultiPart multipart = new FormDataMultiPart().bodyPart(filePart);
Invocation.Builder invocationBuilder = webTarget.request().accept(MediaType.APPLICATION_JSON);
Response response = invocationBuilder
        .buildPost(Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA))
        .invoke();

2 个答案:

答案 0 :(得分:3)

FileDataBodyPart只是一个便利课程。它不是您可以用来创建身体部位的唯一类型。如果您查看FormDataMultuPart.bodyPart()的文档,您会看到它以BodyPart为参数。查看Javadocs(搜索它;找不到直接链接)。如果您查找BodyPart并遍历层次结构,则有一些类从[{1}}延伸,如BodyPart(最通用)和FormDataBodyPart。你可以使用其中任何一个。

如果您有StreamDataBodyPart,最简单的方法是使用InputStream。看到j​​avadoc,它有重载的构造函数。

如果你必须使用StreamDataBodyPart,那么你可以使用更通用的byte[]

FormDataBodyPart

部件应该有一个byte[] bytes = "HelloWorld".getBytes(StandardCharsets.UTF_8); FormDataContentDisposition fdcd = FormDataContentDisposition.name("test") .fileName("hello.txt").build(); FormDataBodyPart bodyPart = new FormDataBodyPart(fdcd, bytes, MediaType.TEXT_PLAIN_TYPE); MultiPart multiPart = new FormDataMultiPart().bodyPart(bodyPart); 标题,它提供有关该部件的一些信息,因此服务器可以正确处理它。 Content-DispositionFileDataBodyPart将在内部处理StreamDataBodyPart的创建,这就是为什么它们是便利类。

答案 1 :(得分:2)

FileDataBodyPart没有办法接受文件。

作为一种解决方法,您可能希望创建一个临时文件并在JVM退出后将其删除:

byte[] bytes = {1, 2, 3};

File tempFile = File.createTempFile("filename", null);
tempFile.deleteOnExit();

FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(bytes);
fos.close();

FileDataBodyPart filePart = new FileDataBodyPart("attachment", tempFile);