CXF

2012-01-18 12 views
6

साथ एक से अधिक फ़ाइलों और मेटाडाटा अपलोड कर रहा है मैं CXF के साथ एक बाकी वेब सेवा के रूप में एक फ़ाइल अपलोड हैंडलर बनाना होगा। मैं निम्नलिखित की तरह कोड का उपयोग मेटाडाटा के साथ एक एकल फाइल अपलोड करने में सक्षम किया गया है: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(); 
} 

अब मैं एक ही अनुरोध में एक से अधिक फ़ाइलों को अपलोड करने के लिए समर्थन जोड़ने की जरूरत है। इस मामले में, image/jpeg सामग्री प्रकार के साथ में अनुलग्नक के बजाय, मैं multipart/mixed सामग्री प्रकार, जो अपने आप अलग-अलग image/jpeg संलग्नक है कि मैं की आवश्यकता होती है के साथ एक अनुलग्नक मिलता है।

मैं कई JSON अपलोड या JAXB मेटाडाटा के साथ वस्तुओं के लिए उदाहरण देखा है, लेकिन मैं द्विआधारी छवि डेटा के साथ काम करने के लिए कुछ भी प्राप्त करने में सक्षम नहीं किया गया है। मैं सीधे MultipartBody उपयोग करने की कोशिश की है, लेकिन यह केवल multipart/mixed अटैचमेंट है, न image/jpeg संलग्नक के भीतर एम्बेडेड देता है।

वहाँ एक रास्ता रिकर्सिवली एम्बेडेड संलग्नक पाने के लिए एक multipart/mixed लगाव पार्स करने के लिए है? मैं निश्चित रूप से multipart/mixed लगाव के इनपुट स्ट्रीम प्राप्त कर सकते हैं और अपने आप को पार्स आउट फ़ाइलें, लेकिन मैं आशा करती हूं कि वहाँ एक बेहतर तरीका है।

अद्यतन

इस 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

आप पैरामीटर को परिभाषित करने की कोशिश की है का उपयोग कर परिवर्तित किया जा सकता पसंद करते हैं अंतिम @ मल्टीपार्ट ("छवि") की तरह सूची छवियां या सामग्री प्रकारों के साथ यह एक समस्या है? – AxelTheGerman

+0

@axel अगर मैं अनुलग्नक सूची में एक मल्टीपार्ट एनोटेशन जोड़ता हूं तो सीएक्सएफ सिर्फ एक शून्य मान पास करता है। मुझे छवियों को पाने के लिए इसे अव्यवस्थित छोड़ना है। –

उत्तर

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(); 
} 
संबंधित मुद्दे