JSP: Download erzwingen

Der Held

Erfahrenes Mitglied
Hi, meine JSP erzeugt eine XML Datei auf dem Server, diese soll vom User runtergeladen werden.
Mit
Code:
response.sendRedirect( fileName );
leite ich auf diese Datei um, allerdings wird sie im Browser angezeigt anstatt, dass der download Dialog aufgeht. Wie kann ich das erzwingen (falls ueberhaupt)?

Gruss,
DH
 
Du kannst es ja mal mit


Code:
response.setContentType("application/download");
(Den MIME-Typ gibt es nicht -> Browser bietet Download-Dialog an)

versuchen. Bin mir aber nicht sicher ob das dann auch bei einer Weiterleitung geht..
 
Zusammen mit dem Redirect funktioniert es nicht. Das ist auch klar, denke ich, da setContentType ja schliesslich den MimeTyp des aktuellen Dokumentes, also der JSP-Seite in der der aufruf stattfindet veraendert.

Ich habe daher anstelle des FileOutputStream direkt ins Dokument geschrieben und den MimeTyp wie vorgeschlagen auf "application/download" gesetzt. Das klappt soweit auch klasse.

Allerdings moechte ich natuerlich, dass die Datei eine .xml Endung hat und keine .jsp. Selber umbenennen ist natuerlich wenig benutzerfreundlich und sorgt fuer Probleme. Also gibt es zwei moeglichekeiten: Irgendwie dem Browser eine Dateiendung fuer das zu downloadende File vorgeben, wobei ich nicht glaube, dass das geht, oder 2. den JSP-Code in einer XML-Seite einbetten und Tomcat beibringen, dass er auch XML-Dokumente nach JSP parsen muss, habe aber keine Ahnung wie/wo das geht.

Gibt es sonst noch weitere Moeglichkeiten?

Gruss,DH
Merci fuer die Antwort
 
Wäre es nicht wesentlich einfacher einen einfachen Link auf die Datei anzuzeigen? Evtl. könntest du es auch mit JavaScript lösen, zumindest in den Meisten Downloadseiten kommt immer die Meldung "Der Download startet in Kürze, falls das nicht der Fall sein sollte, klicken Sie hier". Oder du verpackst deine XML-Datei in einer *.zip Datei. Dann müsste der Browser automatisch Downloaden, glaube ich. Eigentlich nur sinnvoll bei großen Dateien, aber ich weiß ja nicht wie groß deine XML-Dateien sind und ansonsten auch nicht weiter schlimm.
 
Also hab mich noch mal ein bissel eingelesen und dann folgendes gefunden:

http://www.galileocomputing.de/openbook/javainsel4/javainsel_17_008.htm
Zitat:
<%
String url = ";;

response.sendRedirect( url );
%>

Was passiert beim Umlenken?

Technisch gesehen ist eine Umlenkseite eine ganz normale Web-Seite. Das wirkliche Umlenken ist eine Fähigkeit des Browsers und nicht des Servers. Dies ist wichtig zu bemerken, da eigene Programme, die URL-Verweise aufbauen, dieses oft nicht korrekt behandeln.

Das Servlet setzt beim sendRedirect() den Content-Type auf "text/html". Wichtig sind zwei weitere Informationen: eine in der Statuszeile und eine im Header. In der Statuszeile wird die Nummer 302 gesendet, die das Umlenken bezeichnet. Die Information darüber, wohin verwiesen wird, steht in einem weiteren Header mit dem Namen »Location«. Somit können wir unser Redirect prinzipiell auch selber ausformulieren, indem wir schreiben:

response.setStatus( 302 );
response.setContentType( "text/html" );
response.setHeader( "Location", url );

Der String s ist dann eine Referenz auf die neue Seite. Der Verweis auf die externe Seite muss dann natürlich absolut sein. Doch dies regelt sendRedirect() automatisch.

Ich denke du könntest das dann mit dem "manuellen" Umlenken auch machen, indem du da den ContentType auf application/download setzt und die URL entsprechend anpasst...
 
Was ich auch noch anmerken wollte, mir ist aufgefallen dass man hier im Forum bei gewissen Posts ja Dateien anhängen kann. Die werden auch immer über den Downloadmanager aufgerufen, egal welchen Typ sie haben.
 
Hallo, danke fuer die Antworten.

Ich habs zwar so geloest, dass eine Datei auf dem Server abgelegt wird, aber am elegantesten faende ich ich es, wenn die generierte Seite direkt runtergeladen werden kann, da ich mich dann nicht mehr um die "Verbleibsel" auf dem Server kuemmern muss.

Die Loesung mit JavaScript wuerde zumindest fuer den Benutzer so aussehen wie gewuenscht. Eine Seite auf der nur ein Link angeboten wird, ohne automatischen download finde ich nicht angemessen.

Die Sache mit der Weiterleitung ist interessant, aber dabei muss ich immernoch eine Datei auf dem Server ablegen.

Momentan habe ich schon fast die gewuenschte Funktionalitaet erreicht, sobald ich den Link anklicke der mich zur JSP - Seite fuehrt wird mir ein Download angeboten. Das runtergeladene File enthaelt das XML-Dokument hat aber noch Standardmaessig die Endung .jsp statt .xml. Das ist alles.

Hier mal der Code, ich habe JDOM zur generierung des XML-Files benutzt
Code:
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="org.jdom.output.*" %>
<%@ page import="org.jdom.Document" %>
<%@ page import="java.io.*" %>
<%//@ page errorPage="error.jsp" %>
<jsp:useBean id="export" class ="beans.ExportBean" />

<%

export.setProjectID(Integer.parseInt(request.getParameter( "pid" )));
export.createDocument();
XMLOutputter output = new XMLOutputter(Format.getPrettyFormat());

response.setContentType("application/download");

%>
<%= output.outputString(export.getDoc())	 %>
 
Hm, mir fällt noch etwas ein *ggg* Ähm, bist du Vertraut mit dem phpBB Forum? Dort gibt es im Administrationsbereich die Funktion "Datenbank Backup". Wenn du diese Seite aufrufst öffnet sich auch eine PHP-Seite die den Downloadmanager aufruft und speichert die Datei im *.sql Format.

Ich weiß leider nicht wie das dort Umgesetzt wurde... ist auch PHP, aber das lässt sich dann sicher auch irgendwie in JSP realisieren.
 
Kenne ich, phpMyAdmin hat auch was sehr aehnliches, man kann sich nen Datenbankdump als file Downloaden und dabei wird IMHO auch kein File auf dem Server angelegt sondern direkt runtergeladen.

Nur wie ist das mit JSP zu knacken?
 
Zurück