【问题标题】:Jersey REST client - multipart creation - not from File objectJersey REST 客户端 - 多部分创建 - 不是来自 File 对象
【发布时间】:2017-09-12 09:53:18
【问题描述】:

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

public FileDataBodyPart(String name, File fileEntity)

但就我而言,我拥有的是一个字节[],我不想将其转换为文件并存储在文件系统中。

在最坏的情况下使用其他客户端库从字节数组、输入流...生成多部分(上传文件时)有没有其他方法?

更新: 这是工作代码(但我想使用 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();

【问题讨论】:

  • 这个问题还不清楚。显示更多代码。你的意图是什么?
  • 问题已更新。

标签: java rest jersey client multipart


【解决方案1】:

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 的创建,这就是为什么它们是 convenience 类。

【讨论】:

  • 这是我的选择。谢谢。
  • 不知何故 StreamDataBodyPart 对我不起作用(也不例外,但服务器端没有数据),但创建 FormDataBodyPart 确实有效!
【解决方案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);

【讨论】:

  • 是的,这可能是一种选择。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 2023-03-12
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多