2011-01-27 29 views
10

Tôi muốn gửi Pdf dưới dạng tệp đính kèm e-mail (Tôi đang sử dụng API JavaMail). Tôi có Pdf (được tạo bởi jasper) dưới dạng byte[].Gửi e-mail trong phần đính kèm Pdf dưới dạng dòng

public InputStream exportPdfToInputStream(User user) throws ParseErrorException, MethodInvocationException, ResourceNotFoundException, JRException, IOException{ 
     JasperPrint jasperPrint = createJasperPrintObject(user); 
     byte[] pdfByteArray = JasperExportManager.exportReportToPdf(jasperPrint); 
     return new ByteArrayInputStream(pdfByteArray); 
    } 

Đây là mã mà tôi đang sử dụng để xây dựng các MimeBodyPart đó sẽ là tập tin đính kèm:

if (arrayInputStream != null && arrayInputStream instanceof ByteArrayInputStream) { 
     MimeBodyPart attachment = new MimeBodyPart(arrayInputStream); 
     attachment.setHeader("Content-Type", "application/pdf"); 
     mimeMultipart.addBodyPart(attachment); 
    } 

Mã này mang lại cho tôi lỗi này:

javax.mail.MessagingException: IOException while sending message; 
    nested exception is: 
    java.io.IOException: Error in encoded stream: needed at least 2 valid base64 characters, but only got 1 before padding character (=), the 10 most recent characters were: "\24\163\193\n\185\194\216#\208=" 

Trả lời

5

Các constructor bạn sử dụng là cho phân tích một phần kịch câm từ việc vận chuyển.

Ví dụ thứ hai của bạn nên hoạt động đúng. Bạn có thể xem xét

  • không chuyển đổi sang InputStream và trở lại, điều này sẽ làm cho các bản sao không cần thiết
  • thêm một bố trí (ví dụ bp.setDisposition (Part.ATTACHMENT);)
+0

@mtraut: Bạn đã nói không chuyển đổi nó thành InputStream và ngược lại, nhưng làm cách nào tôi có thể thực hiện mà không có InputStream? – Atticus

+1

sử dụng ** ByteArrayDataSource (byte [] dữ liệu, String loại) ** constructor và "pdfByteArray" – mtraut

+0

@mtraut: Cảm ơn, đó là những gì tôi đã gửi trong câu trả lời của tôi. Nhưng dù gì cũng cảm ơn. Tôi mặc dù có một cách đơn giản hơn để làm điều đó! – Atticus

20

Tôi đã tìm thấy một giải pháp như được đề xuất trong chuỗi this. Dường như có một lớp học DataSource chỉ được tạo cho mục đích này. Hy vọng ví dụ này cũng sẽ giúp người khác.

if (arrayInputStream != null && arrayInputStream instanceof ByteArrayInputStream) { 
     // create the second message part with the attachment from a OutputStrean 
     MimeBodyPart attachment= new MimeBodyPart(); 
     ByteArrayDataSource ds = new ByteArrayDataSource(arrayInputStream, "application/pdf"); 
     attachment.setDataHandler(new DataHandler(ds)); 
     attachment.setFileName("Report.pdf"); 
     mimeMultipart.addBodyPart(attachment); 
    } 
+0

chúng tôi sử dụng này datahandler quá. – halil

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