2016-10-20 6 views
1

Ich habe ein paar Java-Servlets (3.x - Tomcat 8) ausgeführt, die PDF-Dokumente generieren und zurücksenden. Ich hatte nie Probleme mit irgendwelchen von ihnen. Ich schrieb vor kurzem ein neues Servlet auch ein PDF-Dokument zu erstellen und zurück, und diese neue Servlet des exakt gleiche Stück Antwortcode verwendet, während die andere verwenden:Java-Servlet schreibt keine Antwortbytes

response.reset(); 
response.setContentType("application/pdf"); 
response.setHeader("Content-Transfer-Encoding", "binary"); 
response.setHeader("Content-Disposition","attachment; filename=\""+filename+".pdf\""); 
response.setContentLength(pdfBytes.length); 

System.out.println("# Bytes => " + pdfBytes.length); 

ServletOutputStream sos = response.getOutputStream(); 
BufferedOutputStream bos = new BufferedOutputStream(sos); 
bos.write(pdfBytes); 
sos.flush(); 
sos.close(); 

Wie gesagt, dies war funktioniert gut mit den anderen, aber wenn ich das neue Servlet aufrufen, gibt es 0 Bytes zurück, obwohl die print-Anweisung einen Wert ungleich Null hat.

Allerdings, wenn ich die Antwort Schreiben von Code oben zu ändern:

OutputStream os = response.getOutputStream(); 
os.write(pdfBytes); 
os.flush(); 
os.close(); 

... es funktioniert gut, ein wohlgeformtes PDF-Dokument zurück. Warum könnte das passieren?

+1

Sollte nicht 'sos.flush();' 'sein bos.flush (); usw.? – Thomas

Antwort

3

Sie spülen nicht die BufferedOutputStream - also puffert es alle Ihre Daten. Sie sollten , dass, nicht die ServletOutputStream spülen.

Wenn Sie jedoch nur ein einzelnes Byte-Array schreiben, ist es ohnehin sinnlos, BufferedOutputStream zu verwenden - und Sie sollten sowieso nicht explizit bündig sein, da das Schließen flush ist. Sie müssen also nur:

ServletOutputStream sos = response.getOutputStream(); 
sos.write(pdfBytes); 
// Unclear whether *this* is needed, either. 
sos.close(); 

Ich würde persönlich die Servlet-Container erwartet, dass der Ausgabe-Stream zu schließen, aber es ist nicht klar, aus der Dokumentation. Ob Sie es zu schließen, wenn eine Ausnahme eine andere Sache auftritt, ist ...

+0

Das hat funktioniert! Aber ich verstehe es nicht. Warum funktionieren die anderen Servlets, die denselben Code verwenden, ordnungsgemäß? – RTF

+0

@RTF: Ich vermute, sie sind nicht wirklich. Oder sie funktionieren nur, weil die Daten größer als die Puffergröße sind. Der Code, den Sie dort haben, ist sicherlich kaputt. –

+0

Dient mir zum Kopieren und Einfügen von einem Blogpost und vorausgesetzt, es war korrekt. Sieht so aus, als hätte ich ein bisschen Refactoring zu tun, weil ich für diesen Response-Code keine Boilerplate-Funktion erstellt habe! – RTF

1

sollten Sie wirklich bündig und in der Nähe bos nicht sos

Verwandte Themen