2012-01-18 36 views
6

我需要使用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()); 
    } 
} 
+0

你試圖定義參數轉換像最終@Multipart(「圖像」)列表圖像還是更多的內容類型的問題? – AxelTheGerman 2012-03-21 18:06:48

+0

@axel如果我將多部分註釋添加到附件列表中,CXF只傳遞一個空值。我必須不加修飾才能得到圖像。 – 2012-03-26 20:42:30

回答

0

我已經構建了一個類似的服務來上傳多個圖像。我的實現如下所示(也許它可以幫助)

@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; 

} 

,如果有人喜歡再見數組,而不是輸入流,它可以很容易地使用這個輔助方法

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(); 
}