我需要使用CXF創建文件上傳處理程序作爲REST Web服務。我已經能夠上傳單個文件使用如下代碼的元數據:使用CXF上傳多個文件和元數據
@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();
}
現在我需要添加在同一請求上傳多個文件的支持。在這種情況下,我得到一個附件,內容類型爲multipart/mixed
,它本身包含我需要的個人附件image/jpeg
,而不是image/jpeg
附件。
我見過使用元數據上傳多個JSON或JAXB對象的示例,但我無法獲得任何與二進制圖像數據一起使用的示例。我曾嘗試直接使用MultipartBody,但它只返回嵌入其中的附件multipart/mixed
,而不嵌入image/jpeg
附件。
有沒有辦法遞歸地解析multipart/mixed
附件以獲取嵌入的附件?我當然可以獲得multipart/mixed
附件的輸入流,並自己解析文件,但我希望有更好的方法。
UPDATE
這似乎kludgey,但下面的代碼位是不夠好現在。我很樂意看到更好的方式。
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());
}
}
你試圖定義參數轉換像最終@Multipart(「圖像」)列表圖像還是更多的內容類型的問題? –
AxelTheGerman
2012-03-21 18:06:48
@axel如果我將多部分註釋添加到附件列表中,CXF只傳遞一個空值。我必須不加修飾才能得到圖像。 – 2012-03-26 20:42:30