Frage

ich habe ein Problem versucht, eine Zip-Datei in einer JSP zu dienen.

Die Zip-Datei ist immer korrupt, nachdem das Download beendet ist. Ich habe ein paar verschiedene Methoden zum Lesen und Schreiben versucht, und keiner von ihnen scheint den Trick zu tun.

ich meine, es ist wahrscheinlich in ASCII-Zeichen irgendwo als Datei hinzufügen wird geöffnet und zeigt alle Dateinamen, aber ich kann keine Dateien extrahieren.

Hier ist mein letzter Code:

<%@ page import= "java.io.*" %>

<% 
    BufferedReader bufferedReader = null;

    String zipLocation = "C:\\zipfile.zip"; 

    try
    {
        bufferedReader = new BufferedReader(new FileReader(zipLocation));
        response.setContentType("application/zip");
        response.setHeader( "Content-Disposition", "attachment; filename=zipfile.zip" );

        int anInt = 0;
        while((anInt = bufferedReader.read()) != -1)
        {
            out.write(anInt);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
%>

EDIT: Ich zog den Code auf ein Servlet und es immer noch nicht funktioniert. Ich änderte um mehr Material eines Bündels, also hier ist der neueste nicht-funktionierenden Code:

public void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException
{
    try
    {
        String templateLocation = Config.getInstance().getString("Site.templateDirectory");

        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=output.zip;");

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(baos);
        FileInputStream fis = new FileInputStream(templateLocation);

        int len;
        byte[] buf = new byte[1024];

        while ((len = fis.read(buf)) > 0)
        {
            bos.write(buf, 0, len);
        }

        bos.close();
        PrintWriter pr = response.getWriter();
        pr.write(baos.toString());
        pr.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

EDIT2:

Dies ist der Servlet-Code, den ich tatsächlich funktioniert. Vielen Dank an alle!

public void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException
{
    try
    {
        String templateLocation = Config.getInstance().getString("Site.templateDirectory");

        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=output.zip;");

        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        FileInputStream fis = new FileInputStream(templateLocation);

        int len;
        byte[] buf = new byte[1024];

        while ((len = fis.read(buf)) > 0)
        {
            bos.write(buf, 0, len);
        }

        bos.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
War es hilfreich?

Lösung

Zips sind binäre Dateien und daher nicht geeignet für als Zeichendaten übertragen werden. Auch Text außerhalb des Codes kann die Datei beschädigt werden.

Verwenden Sie einen einfachen, Vanille-Servlet statt der JSP.

Andere Tipps

Die JSP fügt Leerzeichen auf den Ausgang. Ich schlage vor, Sie dies zu einem Servlet bewegen.

Alternativ können Sie auch einen Blick auf Leerzeichen aus jsp Ausgabe Strip, aber ich bin nicht sicher, dass es nicht die ZIP-Ausgabe selbst beeinflussen würde.

Das Problem in diesem genauen Schnipsel ist auf Linie zwei - Sie haben eine leere Zeile außerhalb JSP-Tags, die an den Browser als HTML gesendet wird (das heißt eine Leerzeile in HTML-Quelle).

Seien Sie sehr vorsichtig, etwas zu entfernen, die nicht in <%%>, insbesondere Leerzeichen (auch ein Terminal Newline!), Oder folgen Sie dem Rat an anderer Stelle und verwenden Sie ein Servlet:)

Ihr Servlet-Code funktioniert nicht, weil Sie Ihren Strom ausgeben response.getWriter(), die wie andere darauf hingewiesen haben, ist für Zeichendaten . Ich zitiere den Javadoc:

  

PrintWriter getWriter() throws IOException
  Gibt ein Printwriter-Objekt, das Zeichen Text an den Client senden kann. Die Printwriter verwendet die Zeichencodierung zurück durch getCharacterEncoding ()

Nicht nur das, aber Sie sind nicht einmal den Byte-Array an den Writer Schreiben Sie die Ergebnisse ByteArrayOutputStream.toString() schreiben, die auch eine Zeichenkonvertierung funktioniert ~

Sie verwenden möchten response.getOutputStream (), so etwas wie:

BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

Und dann den Byte Inhalt der Datei schreiben.

Die Leser sind in der Regel für Zeichenströme, wenn ich mich richtig erinnere - Sie könnten versuchen, etwas mehr nach dem Vorbild eines ByteArrayOutputStream? Auch in der Tat die JSP korrumpieren die Ausgabe könnte wie andere berichtet haben.

bufferedReader = new BufferedReader(new FileReader(zipLocation));

Neben der Servlet / JSP Problem, diese Zeile Ihre Daten mit 100% iger Sicherheit korrumpiert. Er wird versuchen, die binären Daten als Text unter Verwendung der Standard-Plattform-Codierung zu interpretieren, was bedeutet, dass etwa die Hälfte der Bytes in der Datei mit „unbekanntem Zeichen“ ersetzt werden.

Bytes und Strings sind nicht das Gleiche!

Ich würde auch vorschlagen, ein einfaches Servlet zu verwenden und hielte Antwort des Robert Munteanu als richtig, aber man könnte dies auch in Ihrer JSP tun. Das Problem ist nicht die zugegebenen Leerzeichen, sondern dass die impliziten Variable „out“ ist eine Instanz von JspWriter und ein Writer ist für Zeichen, nicht für Byte. Versuchen Sie, mit response.getOutputStream () und Recht darauf sollte das funktionieren. Sie erhalten eine Ausnahme erhalten sagen, jemand anderes bereits den Output bekam, aber Sie können es ignorieren.

Aber wie gesagt, ein Servlet mit wäre viel sauberer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top