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

Mar*_*ark 5 java rest client multipart jersey

我想除了提供File对象外,没有其他方法可以创建FileDateBodyPart:

public FileDataBodyPart(String name, File fileEntity)
Run Code Online (Sandbox Code Playgroud)

但就我而言,我只有一个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();
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 5

FileDataBodyPart只是一个方便类。它不是您可以用来创建身体部位的唯一类型。如果您查看 的文档FormDataMultuPart.bodyPart(),您会看到它作为参数 a BodyPart。查看Javadocs(搜索它;找不到直接链接)。如果您查找BodyPart并遍历层次结构,则有一些类是从 扩展的BodyPart,例如FormDataBodyPart(最通用的)和StreamDataBodyPart. 你可以使用。

如果您有InputStream,最简单的方法是使用StreamDataBodyPart. 请参阅 javadoc,它重载了构造函数。

如果您必须使用 a 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);
Run Code Online (Sandbox Code Playgroud)

零件应该有一个Content-Disposition标题,它提供有关零件的一些信息,以便服务器可以正确处理它。在FileDataBodyPartStreamDataBodyPart会处理的创建FormDataContentDisposition内部,这就是为什么他们是方便类。


Luc*_*ens 4

没有其他方法可以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);
Run Code Online (Sandbox Code Playgroud)