gpt4 book ai didi

java - 使用 CXF 上传多个文件和元数据

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:09 27 4
gpt4 key购买 nike

我需要使用 CXF 创建一个文件上传处理程序作为 REST Web 服务。我已经能够使用如下代码上传带有元数据的单个文件:

@POST
@Path("/uploadImages")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadImage(@Multipart("firstName") String firstName,
@Multipart("lastName") String lastName,
List<Attachment> attachments) {

for (Attachment att : attachments) {
if (att.getContentType().getType().equals("image")) {
InputStream is = att.getDataHandler().getInputStream();
// read and store image file
}
}

return Response.ok().build();
}

现在我需要添加对在同一个请求中上传多个文件的支持。在这种情况下,我得到的不是内容类型为 image/jpeg 的附件,而是内容类型为 multipart/mixed 的附件,它本身包含单独的 image/jpeg 我需要的附件。

我见过使用元数据上传多个 JSON 或 JAXB 对象的示例,但我无法获得任何可用于二进制图像数据的内容。我试过直接使用 MultipartBody,但它只返回 multipart/mixed 附件,而不返回其中嵌入的 image/jpeg 附件。

有没有一种方法可以递归解析 multipart/mixed 附件以获取嵌入式附件?我当然可以获取multipart/mixed附件的输入流,然后自己解析文件,但我希望有更好的方法。

更新

这看起来很笨拙,但下面的代码现在已经足够好了。不过,我很乐意看到更好的方法。

for (Attachment att : attachments) {
LOG.debug("attachment content type: {}", att.getContentType().toString());

if (att.getContentType().getType().equals("multipart")) {
String ct = att.getContentType().toString();
Message msg = new MessageImpl();
msg.put(Message.CONTENT_TYPE, ct);
msg.setContent(InputStream.class, att.getDataHandler().getInputStream());
AttachmentDeserializer ad = new AttachmentDeserializer(msg, Arrays.asList(ct));
ad.initializeAttachments();

// store the first embedded attachment
storeFile(msg.getContent(InputStream.class));

// store remaining embedded attachments
for (org.apache.cxf.message.Attachment child : msg.getAttachments()) {
storeFile(child.getDataHandler().getInputStream());
}
}
else if (att.getContentType().getType().equals("image")) {
storeFile(att.getDataHandler().getInputStream());
}
}

最佳答案

我构建了一个类似的服务来上传多张图片。我的实现如下所示(也许有帮助)

@Consumes({MediaType.MULTIPART_FORM_DATA,"multipart/mixed" })
public Response uploadImages(final List<Attachment> attachments) {

Map<String, InputStream> imageMap = new HashMap<String, InputStream>();

for (Attachment attachment : attachments) {
String imageName = attachment.getContentDisposition().getParameter("filename");
if (imageName == null) {
imageName = UUID.randomUUID().toString();
}

InputStream image = attachment.getDataHandler().getInputStream();
imageMap.put(imageName, image);
}

return imageMap;

}

如果有人更喜欢 bye 数组而不是输入流,可以使用这个辅助方法轻松转换它

private static byte[] extractByteArray(final InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

byte[] dataChunk = new byte[1024 * 16];
int numRead = 0;
while (numRead != -1) {
numRead = inputStream.read(dataChunk, 0, dataChunk.length);

if (numRead != -1) {
buffer.write(dataChunk, 0, numRead);
}
}

buffer.flush();
return buffer.toByteArray();
}

关于java - 使用 CXF 上传多个文件和元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com