CXF

2012-01-18 26 views
6

ile birden fazla dosya ve meta veri yükleme CXF ile bir REST web hizmeti olarak bir dosya yükleme işleyicisi oluşturmam gerekiyor. Ben meta verileri aşağıdaki gibi kod kullanarak tek bir dosya yüklemek mümkün oldum: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(); 
} 

Şimdi aynı istekte birden fazla dosya yükleme desteği eklemek gerekir. Bu durumda, image/jpeg içerik türü ile bir ek yerine, ihtiyacım olan bireysel image/jpeg eklerini içeren multipart/mixed içerik türünde bir ek alırım.

Birden çok JSON veya JAXB nesnesini meta verilerle karşıya yüklerken örnekler gördüm, ancak ikili görüntü verileriyle çalışmak için hiçbir şey alamadım. Doğrudan MultipartBody kullanmayı denedim, ancak içinde gömülü image/jpeg eklerini değil, yalnızca multipart/mixed ekini döndürür.

Katıştırılmış ekleri almak için yinelemeli olarak multipart/mixed ekini ayrıştırma yolu var mı? Tabii ki multipart/mixed ekinin giriş akışını alabilirim ve dosyaları kendim ayrıştırabilirim, ama daha iyi bir yol olduğunu umuyorum.

GÜNCELLEME

Bu kludgey görünüyor, ama aşağıdaki kod bit şu an için yeterli olduğunu. Yine de daha iyi bir yol görmeyi çok isterim.

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

parametreyi tanımlamaya çalıştık bu yardımcı yöntemini kullanarak kolayca dönüştürülebilir akışları yerine güle dizileri tercih ederse final @Multipart ("image") List görüntülerini nasıl buldunuz ya da içerik türleriyle ilgili daha fazla sorun mu var? – AxelTheGerman

+0

@axel Ekler listesine Çok Komutlu bir açıklama eklediğimde CXF sadece boş bir değer iletir. Görüntüleri elde etmek için onu undecorated bırakmak zorundayım. –

cevap

0

Birden çok görüntü yüklemek için benzer bir hizmet yapıyorum. Benim uygulama aşağıda (belki yardımcı olur) benziyor

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

} 

birisi girdi, bu

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