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)
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标题,它提供有关零件的一些信息,以便服务器可以正确处理它。在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);
Run Code Online (Sandbox Code Playgroud)