Frage

Ich versuche, Tomcat zu bekommen, die Servlet-Inhalte als bzip2-Datei zu schreiben (Dumme Forderung vielleicht, aber es ist offensichtlich notwendig, für einige Integrationsarbeit). Ich bin mit der Spring-Framework so dass diese in einem AbstractController ist.

Ich bin mit der bzip2-Bibliothek von http://www.kohsuke.org/bzip2/

ich die Inhalte bzipped fein bekommen kann, aber wenn die Datei geschrieben wird, um es eine Reihe von Meta-Daten zu enthalten scheint und ist nicht wiederzuerkennen als bzip2-Datei.

Hier ist, was ich tue

// get the contents of my file as a byte array
byte[] fileData =  file.getStoredFile();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

//create a bzip2 output stream to the byte output and write the file data to it             
CBZip2OutputStream bzip = null;
try {
     bzip = new CBZip2OutputStream(baos);
     bzip.write(fileData, 0, fileData.length);
     bzip.close();  
} catch (IOException ex) {
     ex.printStackTrace();
}
byte[] bzippedOutput = baos.toByteArray();
System.out.println("bzipcompress_output:\t" + bzippedOutput.length);

//now write the byte output to the servlet output
//setting content disposition means the file is downloaded rather than displayed
int outputLength = bzippedOutput.length;
String fileName = file.getFileIdentifier();
response.setBufferSize(outputLength);
response.setContentLength(outputLength);
response.setContentType("application/x-bzip2");
response.setHeader("Content-Disposition",
                                       "attachment; filename="+fileName+";)");

Dies wird aus dem folgenden Verfahren in der abstractcontroller Frühling genannt

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)  throws Exception

Ich habe ein paar Stichen es in verschiedenen Ansätzen getroffen wurden, einschließlich direkt an den ServletOutput schreiben, aber ich bin ziemlich ratlos und nicht finden können alle / viele Beispiele online.

Jede Beratung von jedem, der vor über dazu gekommen ist würde sehr geschätzt werden. Alternative Bibliotheken / Ansätze sind in Ordnung, aber leider muss es bzip2'd werden.

War es hilfreich?

Lösung

Der entsandte Ansatz ist in der Tat seltsam. Ich habe geschrieben, so dass es mehr Sinn macht. Probieren Sie es aus.

String fileName = file.getFileIdentifier();
byte[] fileData = file.getStoredFile(); // BTW: Any chance to get this as InputStream? This is namely memory hogging.

response.setContentType("application/x-bzip2");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

OutputStream output = null;

try {
     output = new CBZip2OutputStream(response.getOutputStream());
     output.write(fileData);
} finally {
     output.close();
}

Sie sehen, wickeln nur den Ausgangsstrom der Reaktion mit CBZip2OutputStream und schreiben die byte[] zu.

Sie können passieren IllegalStateException: Response already committed kommt danach in den Server-Logs sehen (mit dem Download korrekt durch die Art und Weise gesendet werden), dann bedeutet es, dass Frühling versucht, die Anforderung / Antwort darauf zu übermitteln. Ich tue es nicht Frühling, so dass ich nicht im Detail gehen, aber man sollte zumindest anweisen Spring Aufenthalt weg aus der Antwort. Lassen Sie es nicht eine Zuordnung zu tun, nach vorne oder was auch immer. Ich denke Rückkehr null genügt.

Andere Tipps

Sie könnten finden die Arbeit mit CompressorStreamFactory von commons-Kompresse ein wenig leichter. Es ist ein Erblasser der Ant-Version sind Sie bereits mit und endet zwei Linien unterscheidet sich von BalusC dem Beispiel arbeiten.

Mehr oder weniger eine Frage der Bibliothek bevorzugt.

OutputStream out = null;
try {
    out = new CompressorStreamFactory().createCompressorOutputStream("bzip2", response.getOutputStream());
    IOUtils.copy(new FileInputStream(input), out); // assuming you have access to a File.
} finally {
    out.close();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top