2011-01-27 10 views
10

Chcę wysłać plik PDF jako załącznik do wiadomości e-mail (korzystam z interfejsu API JavaMail). Mam Pdf (generowany przez Jaspera) jako byte[].Wysyłaj wiadomość e-mail w załączniku do pliku PDF jako strumień

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

Oto kod, który używam do skonstruowania MimeBodyPart że będzie przywiązanie:

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

Ten kod daje mi ten błąd:

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=" 

Odpowiedz

5

Konstruktor użyłeś jest parsowania część mime z transportu.

Twój drugi przykład powinien się sprawdzić. Można rozważyć

  • nie konwertować do InputStream iz powrotem, uczyni to niepotrzebne kopie
  • dodać dyspozycję (np bp.setDisposition (Part.ATTACHMENT))
+0

@mtraut: Powiedziałeś, aby nie konwertować go do InputStream iz powrotem, ale jak mogę to zrobić bez InputStream? – Atticus

+1

użyj danych ** ByteArrayDataSource (byte [] data, String type) ** constructor i "pdfByteArray" – mtraut

+0

@mtraut: Dzięki, to jest to, co już przesłałem w mojej odpowiedzi. Ale i tak dzięki. Chociaż istnieje jeszcze prostszy sposób na zrobienie tego! – Atticus

20

Znalazłem rozwiązanie sugerowane w wątku this. Wygląda na to, że istnieje klasa DataSource stworzona właśnie w tym celu. Mam nadzieję, że ten przykład pomoże także innym.

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

używamy tego także przeglądarka danych. – halil

Powiązane problemy