Jersey Rest客户端 - 多部分创建 - 不是来自文件对象



我想没有其他方法可以创建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标头,该标头提供了一些有关该零件的信息,以便服务器可以正确处理。FileDataBodyPartStreamDataBodyPart将在内部处理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);

最新更新