我想没有其他方法可以创建filedateBodyPart,而不是提供文件对象:
public FileDataBodyPart(String name, File fileEntity)
,但是就我而言,我拥有的是一个字节[],我不想将其转换为文件并存储在文件系统上。
是否还有其他方法可以从一个字节,InputStream数组中生成多部分(上传文件)...在最坏的情况下,使用其他客户端库?
更新:这是工作代码(但我想使用字节[]而不是文件):
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();
FileDataBodyPart
只是一个便利类。这不是您可以使用创建身体部位的唯一类型。如果您查看FormDataMultuPart.bodyPart()
的文档,您会发现它将其作为参数BodyPart
。查看Javadocs(搜索它;找不到直接链接)。如果您查找BodyPart
并穿越层次结构,则有几个从BodyPart
延伸,例如FormDataBodyPart
(最通用)和StreamDataBodyPart
。您可以使用。
如果您有InputStream
,则最简单的方法是使用StreamDataBodyPart
。请参阅Javadoc,它已超载构造函数。
如果您必须使用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
将在内部处理FormDataContentDisposition
的创建,这就是为什么它们是便利性类。
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);