我猜没有其他方法可以创建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();
答案 0 :(得分:3)
FileDataBodyPart
只是一个便利课程。它不是您可以用来创建身体部位的唯一类型。如果您查看FormDataMultuPart.bodyPart()
的文档,您会看到它以BodyPart
为参数。查看Javadocs(搜索它;找不到直接链接)。如果您查找BodyPart
并遍历层次结构,则有一些类从[{1}}延伸,如BodyPart
(最通用)和FormDataBodyPart
。你可以使用其中任何一个。
如果您有StreamDataBodyPart
,最简单的方法是使用InputStream
。看到javadoc,它有重载的构造函数。
如果你必须使用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-Disposition
和FileDataBodyPart
将在内部处理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);