2012-03-19 38 views
7

Tôi muốn gửi email có tệp đính kèm tệp zip .. Tôi có thể gửi tệp pdf mà không lưu chúng vào vị trí thực tế bằng cách sử dụng ByteArrayOutputStream. Nhưng khi tôi thử zip những tập tin gửi nó không hoạt động. Nó cho phép đính kèm bất hợp pháp ngoại lệ.Cách gửi tệp zip mà không cần tạo tệp đó trên vị trí thực?

Dưới đây là mã tôi đã viết để tạo mã zip.

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

Bạn có thể thêm stacktrace không? –

Trả lời

0

Tôi nghĩ rằng bạn chưa xả và đóng ZipOutputStream. Hãy thử gọi zos.flush(); zos.close(). Hy vọng điều này có thể giúp cho bạn.

Nếu không tìm cách trích xuất mảng byte từ ByteArrayOutputStream, hãy lưu nó vào tệp và mở bằng công cụ hỗ trợ zip. Nó chỉ là để gỡ lỗi để chắc chắn rằng ZIP của bạn là OK và không bị hỏng.

2

Bạn quên gọi zos.closeEntry() sau mỗi mục được viết, vào cuối vòng lặp for của bạn. Và như đã nói, bạn chưa đóng ZipOutputStream của mình.

Tôi không nghĩ bạn cũng cần phải gọi đến entry.setSize().

Nếu không, tính năng này sẽ hoạt động.

Các vấn đề liên quan