6 Stimmen

Rückgabe einer CSV-Datei von einem Servlet mit ServletOutputStream über HTTPS im Internet Explorer

Ich habe ein Servlet, das eine csv-Datei zurückgibt, die über HTTP sowohl im Internet Explorer als auch in Firefox "funktioniert". Wenn ich dasselbe Servlet über HTTPS ausführe, lädt nur Firefox die CSV-Datei weiterhin über HTTPS herunter. Ich glaube nicht, dass dies unbedingt ein Problem von Internet 6 oder 7 ist. auf MSDN :

Die Botschaft lautet:

Internet Explorer kann nicht herunterladen data.csv von mydomain.com Internet Explorer konnte diese Datei nicht öffnen Internet-Seite öffnen. Die angeforderte Site ist entweder nicht verfügbar oder kann nicht gefunden werden. Bitte versuchen Sie es später noch einmal.

Bitte beachten Sie, dass die Website auch nach dieser Meldung noch funktioniert und Sie weiterhin auf der Website surfen können. Diese Meldung wird nur durch den Download der CSV-Datei ausgelöst. Ich konnte auf ähnliche Dateien über https auf IE von anderen j2ee-Anwendungen zugreifen, also glaube ich, dass es unser Code ist. Sollten wir den bufferedOutputStream nicht schließen?

UPDATE

ob der Ausgabestrom geschlossen werden soll oder nicht: Ich habe diese Frage in den Foren der Java Posse gestellt und die Diskussion ist auch aufschlussreich. Letztendlich scheint es, dass sich kein Container darauf verlassen sollte, dass der "Client" (in diesem Fall Ihr Servlet-Code) den Ausgabestrom schließt. Wenn also Ihr Versäumnis, den Stream in Ihrem Servlet zu schließen, ein Problem verursacht, ist dies eher auf die schlechte Implementierung Ihres Servlet-Containers zurückzuführen als auf Ihren Code. Ich habe das Verhalten der IDEs und Tutorien von Sun, Oracle und BEA angeführt und wie sie ebenfalls inkonsistent sind, ob sie den Stream schließen oder nicht.

Über IE-spezifisches Verhalten : In unserem Fall führte ein separates Produkt "Oracle Web Cache" die zusätzlichen Header-Werte ein, die sich nur auf den Internet Explorer auswirken, da der IE die Anforderung "No Cache" umsetzt ( siehe den MSDN-Artikel ). Der Code lautet:

public class DownloadServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, 
                      HttpServletResponse response) throws ServletException, 
                                                           IOException {
        ServletOutputStream out = null;
        ByteArrayInputStream byteArrayInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            response.setContentType("text/csv");
                        String disposition = "attachment; fileName=data.csv";
            response.setHeader("Content-Disposition", disposition);

            out = response.getOutputStream();
            byte[] blobData = dao.getCSV();

            //setup the input as the blob to write out to the client
            byteArrayInputStream = new ByteArrayInputStream(blobData);
            bufferedOutputStream = new BufferedOutputStream(out);
            int length = blobData.length;
            response.setContentLength(length);
            //byte[] buff = new byte[length];
             byte[] buff = new byte[(1024 * 1024) * 2];

            //now lets shove the data down
            int bytesRead;
            // Simple read/write loop.
            while (-1 != 
                   (bytesRead = byteArrayInputStream.read(buff, 0, buff.length))) {
                bufferedOutputStream.write(buff, 0, bytesRead);
            }
            out.flush();
            out.close();

        } catch (Exception e) {
            System.err.println(e); throw e;

        } finally {
            if (out != null)
                out.close();
            if (byteArrayInputStream != null) {
                byteArrayInputStream.close();
            }
            if (bufferedOutputStream != null) {
                bufferedOutputStream.close();
            }
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X