2012-03-19 17 views
7

मैं ज़िप फ़ाइल अटैचमेंट के साथ ईमेल भेजना चाहता हूं .. मैं बाइटएरे ऑटपुटस्ट्रीम का उपयोग करके भौतिक स्थान पर सहेजे बिना पीडीएफ फाइलों को भेजने में सक्षम हूं। लेकिन जब मैं उन फाइलों को ज़िप करने का प्रयास करता हूं तो इसे भेजना इसे काम नहीं करता है। यह अपवाद अवैध लगाव देता है।भौतिक स्थान पर इसे बनाए बिना ज़िप फ़ाइल कैसे भेजें?

नीचे कोड है जिसे मैंने ज़िप बनाने के लिए लिखा है।

private MimeBodyPart zipAttachment(List<ByteArrayOutputStream> attachmentList, List<String> reportFileNames) 
{ 
    MimeBodyPart messageBodyPart = null; 
    try 
    { 
     // File file = File.createTempFile("Reports.zip",".tmp"); 
     // FileOutputStream fout = new FileOutputStream(file); 
     ByteArrayOutputStream bout = new ByteArrayOutputStream(attachmentList.size()); 
     ZipOutputStream zos = new ZipOutputStream(bout); 
     ZipEntry entry; 
     for(int i = 0; i < attachmentList.size(); i++) 
     { 
      ByteArrayOutputStream attachmentFile = attachmentList.get(i); 
      byte[] bytes = attachmentFile.toByteArray(); 
      entry = new ZipEntry(reportFileNames.get(i)); 
      entry.setSize(bytes.length); 
      zos.putNextEntry(entry); 
      zos.write(bytes); 
     } 
     messageBodyPart = new MimeBodyPart(); 
     DataSource source = new ByteArrayDataSource(bout.toByteArray(), "application/zip"); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName("Reports.zip"); 

    } 
    catch(Exception e) 
    { 
     // TODO: handle exception    
    } 
    return messageBodyPart; 
} 
+0

क्या आप स्टैकट्रैक जोड़ सकते हैं? –

उत्तर

0

मुझे लगता है कि आप प्लावित नहीं किया है और ZipOutputStream बंद कर दिया। zos.flush(); zos.close() पर कॉल करने का प्रयास करें। मुझे उम्मीद है कि इससे सहायता मिलेगी।

यदि आपके ByteArrayOutputStream से बाइट सरणी निकालने का प्रयास न करें, तो इसे फ़ाइल में सहेजें और ज़िप-सक्षम टूल के साथ खोलें। यह सुनिश्चित करने के लिए डिबगिंग के लिए है कि आपका ज़िप ठीक है और दूषित नहीं है।

2

आप लूप के अंत में प्रत्येक आइटम लिखे जाने के बाद zos.closeEntry() को कॉल करना भूल गए हैं। और जैसा कि ध्यान दिया गया है, आपने अपने ZipOutputStream को बंद नहीं किया है।

मुझे नहीं लगता कि आपको entry.setSize() को कॉल करने की आवश्यकता है।

अन्यथा, यह काम करना चाहिए।

संबंधित मुद्दे