1. Framework-Agnostiker: Servlet-Download-Datei als Anhang
<!-- 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 ist besser, ein <s:a>
Tag zu verwenden, das mit OGNL auf eine mit erstellte URL zeigt<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 obigen Fällen, Sie müssen das schreiben Content-Disposition - Header an die Antwort , die Angabe , dass die Datei Bedarf heruntergeladen werden ( attachment
) und nicht vom Browser geöffnet ( inline
). Du brauchst den Inhaltstyp angeben und möchten möglicherweise den Dateinamen und die Länge hinzufügen (damit der Browser einen realistischen Fortschrittsbalken zeichnen kann).
Zum Beispiel beim Herunterladen einer ZIP:
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 Aktion als Servlet, z. B. einen Hack für direktes Streaming ), müssen Sie nichts direkt in die Antwort schreiben. Die einfache Verwendung des Stream-Ergebnistyps und dessen Konfiguration in struts.xml funktioniert wie folgt: 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-Agnostiker (/ Struts2-Framework): Servlet (/ Action) öffnet Datei im Browser
Wenn Sie die Datei im Browser öffnen möchten, anstatt sie herunterzuladen, muss die Inhaltsdisposition auf Inline eingestellt sein , aber das Ziel kann nicht der aktuelle Speicherort des Fensters sein. Sie müssen auf ein neues Fenster abzielen, das mit Javascript erstellt wurde, <iframe>
auf die Seite oder auf ein neues Fenster, das im laufenden Betrieb mit dem "diskutierten" target = "_ blank" erstellt wurde:
<!-- 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>