Copies bytes from an InputStream source to a file destination. The directories up to destination will be created if they don't already exist. destination will be overwritten if it already exists. The source stream is closed.
Dieser Code generiert mir ein Inputstream aus einer vorhandenen Webseite (siehe auch in einem anderen Beitrag von mir hier).
Das funktioniert auch und ich übergebe den Inputstream einem anderen Objekt, welcher dann mir eine Email versendet.
Im Anhang der Email befindet sich dann die PDF, daher würde ich sagen, dass das passt und der Stream auch Daten enthält....
Ich bin nun verwirrt...
Das heißt ich muss den InputStream in einen Outputstream wandeln und dann in die Datei (File) schreiben?
Dieser Code generiert mir ein Inputstream aus einer vorhandenen Webseite (siehe auch in einem anderen Beitrag von mir hier).
Das funktioniert auch und ich übergebe den Inputstream einem anderen Objekt, welcher dann mir eine Email versendet.
Im Anhang der Email befindet sich dann die PDF, daher würde ich sagen, dass das passt und der Stream auch Daten enthält....
Das Problem ist hier: byte[] bytes = IOUtils.toByteArray(attachment.getInputStream());
source = new ByteArrayDataSource(bytes, attachment.getMimeType());
Nun meine Frage:
a) was passiert in dem Code, dass das PDF nicht richtig generiert wird?
b) Wie muss mein Code angepasst werden (ohne unbedingt eine Änderung in Multipart addAttachments vornehmen zu müssen?
Das Problem ist hier: byte[] bytes = IOUtils.toByteArray(attachment.getInputStream());
source = new ByteArrayDataSource(bytes, attachment.getMimeType());
1)
InputStream is = pdfDocumentGenerationService.createPdfWithAttachments(offer.getDocumentDesigner(),
fileName, false);
-> Hier verwende ich ExecutorService
2) Code in post #12
-> Sprich der Inputstream wird in ein Objekt (EmailAttachment) hingeschrieben und dann wird die Email versendet (inkl. Anhang, also der Inputstream)
3) Erstellung des Files (Physikalisch)
File destFile = new File("mypath.pdf");
FileUtils.copyInputStreamToFile(inputStream, destFile);
Wie kann ich das denn lösen?
Kann ich nochmals eine Kopie von InputStream is machen, welchen ich dann in 3) verwende?
Ich bekomme auch keinen Compiler Fehler, das File ist einfach nicht korrekt gefüllt.
Also ich sehe zwei Möglichkeiten:
a) Schreib die Daten erst in die Datei - dann kannst Du die Datei wieder lesen.
b) Oder speichere die Daten zwischen um diese dann von dem Zwischenspeicher aus zu nutzen.
b dürfte einfacher sein, denn Du liest ja alles schon in ein byte Array. Also Du kannst das byte Array ja erneut nutzen für einen Stream: ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
und dann diesen InputStream nutzen für das schreiben in die Datei.
A hat den Vorteil, dass Du es nicht im Speicher halten musst aber dafür hast du mehr IO zur Platte (Da dort aber auch ein Cache aktiv sein sollte, sollte das ggf. auch nicht ins Gewicht fallen). B hast Du aber schon fast fertig ...
Vielleicht kann man was mit Stream#mark() und Stream#reset() machen? Das ist aber einfach wild ins Blaue geraten und würde mir auch nicht sehr sauber vorkommen.
Wie kann ich diese Zeile umschreiben, dass der InputStream nicht geschlossen wird (was die Funktion wohl macht):
FileUtils.copyInputStreamToFile(inputStream, destFile);
Wie kann ich diese Zeile umschreiben, dass der InputStream nicht geschlossen wird (was die Funktion wohl macht):
FileUtils.copyInputStreamToFile(inputStream, destFile);
Also ich sehe zwei Möglichkeiten:
a) Schreib die Daten erst in die Datei - dann kannst Du die Datei wieder lesen.
b) Oder speichere die Daten zwischen um diese dann von dem Zwischenspeicher aus zu nutzen.
b dürfte einfacher sein, denn Du liest ja alles schon in ein byte Array. Also Du kannst das byte Array ja erneut nutzen für einen Stream: ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
und dann diesen InputStream nutzen für das schreiben in die Datei.
A hat den Vorteil, dass Du es nicht im Speicher halten musst aber dafür hast du mehr IO zur Platte (Da dort aber auch ein Cache aktiv sein sollte, sollte das ggf. auch nicht ins Gewicht fallen). B hast Du aber schon fast fertig ...
Wie kann ich diese Zeile umschreiben, dass der InputStream nicht geschlossen wird (was die Funktion wohl macht):
FileUtils.copyInputStreamToFile(inputStream, destFile);
b) Hier schreibe ich zwar einen ByteArrayInputStream, aber diese Funktion hat mit den oberen keine direkte Verbindung.... addAttachments() wird irgendwann aufgerufen in 2) in der die Email erstellt wird
Wie kann ich diese Zeile umschreiben, dass der InputStream nicht geschlossen wird (was die Funktion wohl macht):
FileUtils.copyInputStreamToFile(inputStream, destFile);
BTW: ich würde dir wirklich Raten, dir erst die nötigen Grundlagen anzueignen, bevor du dich an das schreiben solch großer Applikation machst, wie du es anscheinend tust. Das, was du aktuell machst, hat nur einen Haufen Bugs und Sicherheitslücken zur Folge...