1. Framework-unabhängig: Servlet lädt Datei als Anhang herunter
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2-Framework: Aktion zum Herunterladen der Datei als Anhang
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Es wäre besser, die <s:a>
Markierung mit OGNL zu einer URL erstellt mit <s:url>
Tag:
<!-- without JS, with Struts tags: THE RIGHT WAY -->
<s:url action="downloadAction.action" var="url">
<s:param name="param1">value1</s:param>
</s:ulr>
<s:a href="%{url}" >download</s:a>
In den oben genannten Fällen müssen Sie brauchen zum Schreiben der Inhalt-Disposition Kopfzeile zum Antwort mit der Angabe, dass die Datei heruntergeladen werden muss ( attachment
) und nicht durch den Browser geöffnet ( inline
). Sie brauchen zur Angabe der Inhalt Typ und fügen Sie den Dateinamen und die Länge hinzu (damit der Browser einen realistischen Fortschrittsbalken zeichnen kann).
Zum Beispiel beim Herunterladen einer ZIP-Datei:
response.setContentType("application/zip");
response.addHeader("Content-Disposition",
"attachment; filename=\"name of my file.zip\"");
response.setHeader("Content-Length", myFile.length()); // or myByte[].length...
Mit Struts2 (es sei denn, Sie verwenden die Action als Servlet, ein Hack für direktes Streaming zum Beispiel), müssen Sie nicht direkt etwas in die Antwort schreiben; es genügt, wenn Sie die Stream-Ergebnis-Typ und die Konfiguration in struts.xml wird funktionieren: BEISPIEL
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="contentLength">${fileLength}</param>
</result>
3. Framework-unabhängig (/ Struts2 Framework): Servlet(/Action) öffnet Datei innerhalb des Browsers
Wenn Sie die Datei im Browser öffnen möchten, anstatt sie herunterzuladen, können Sie die Inhalt-Disposition muss eingestellt werden auf Inline , aber das Ziel kann nicht die aktuelle Fensterposition sein; Sie müssen ein neues Fenster anvisieren, das von javascript erstellt wird, ein <iframe>
auf der Seite oder ein neues Fenster, das mit der Option "diskutiert" target="_blank" erstellt wird:
<!-- From a parent page into an IFrame without javascript -->
<a href="downloadServlet?param1=value1" target="iFrameName">
download
</a>
<!-- In a new window without javascript -->
<a href="downloadServlet?param1=value1" target="_blank">
download
</a>
<!-- In a new window with javascript -->
<a href="javascript:window.open('downloadServlet?param1=value1');" >
download
</a>