2012-01-18 31 views
6

Tôi cần tạo trình xử lý tải tệp lên làm dịch vụ web REST với CXF. Tôi đã có thể tải lên một tệp có siêu dữ liệu bằng cách sử dụng mã như sau:Tải lên nhiều tệp và siêu dữ liệu với 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(); 
} 

Bây giờ tôi cần thêm hỗ trợ tải lên nhiều tệp trong cùng một yêu cầu. Trong trường hợp này, thay vì tệp đính kèm với image/jpeg loại nội dung, tôi nhận được tệp đính kèm với multipart/mixed loại nội dung, chính nó chứa các tệp đính kèm image/jpeg riêng lẻ mà tôi cần.

Tôi đã xem các ví dụ về tải lên nhiều đối tượng JSON hoặc JAXB với siêu dữ liệu, nhưng tôi không thể nhận được bất kỳ thứ gì để làm việc với dữ liệu hình ảnh nhị phân. Tôi đã thử sử dụng trực tiếp MultipartBody, nhưng nó chỉ trả về tệp đính kèm multipart/mixed, không phải đính kèm tệp đính kèm image/jpeg bên trong nó.

Có cách nào phân tích đệ quy một tệp đính kèm multipart/mixed để nhận các tệp đính kèm được nhúng không? Tất nhiên tôi có thể lấy luồng đầu vào của tệp đính kèm multipart/mixed và tự phân tích các tệp, nhưng tôi hy vọng có một cách tốt hơn.

CẬP NHẬT

Điều này có vẻ kludgey, nhưng các bit mã sau đây là đủ tốt cho bây giờ. Tôi rất thích nhìn thấy một cách tốt hơn.

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

Bạn đã cố gắng xác định các tham số giống như cuối cùng @Multipart ("hình ảnh") Danh sách hình ảnh hoặc có vấn đề gì hơn với các loại nội dung không? – AxelTheGerman

+0

@axel Nếu tôi thêm chú thích Multipart vào danh sách đính kèm CXF, chỉ cần chuyển một giá trị null. Tôi phải để nó undecorated để có được những hình ảnh. –

Trả lời

0

Tôi đã tạo một dịch vụ tương tự để tải lên nhiều hình ảnh. thực hiện của tôi trông giống như sau (có thể nó giúp)

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

} 

nếu ai đó thích mảng tạm biệt thay vì đầu vào suối, nó có thể được chuyển đổi dễ dàng sử dụng phương thức này để

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(); 
} 
Các vấn đề liên quan