1. Framework agnostic: Servlet mengunduh file sebagai lampiran
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework: Tindakan mengunduh file sebagai lampiran
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Akan lebih baik menggunakan <s:a>
penunjuk tag dengan OGNL ke URL yang dibuat dengan <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>
Dalam kasus di atas, Anda perlu menulis tajuk Content-Disposition ke respons , menentukan bahwa file tersebut perlu diunduh ( attachment
) dan tidak dibuka oleh browser ( inline
). Anda perlu menentukan Tipe Konten juga, dan Anda mungkin ingin menambahkan nama dan panjang file (untuk membantu browser menggambar progressbar yang realistis).
Misalnya, saat mengunduh 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...
Dengan Struts2 (kecuali jika Anda menggunakan Action sebagai Servlet, hack untuk streaming langsung , misalnya), Anda tidak perlu langsung menulis apa pun ke respons; cukup gunakan tipe hasil Stream dan konfigurasikan dalam struts.xml akan berfungsi: CONTOH
<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 agnostic (/ Struts2 framework): Servlet (/ Action) membuka file di dalam browser
Jika Anda ingin membuka file di dalam browser, alih-alih mengunduhnya, disposisi Konten harus diatur ke inline , tetapi target tidak boleh lokasi jendela saat ini; Anda harus menargetkan jendela baru yang dibuat oleh javascript, <iframe>
halaman, atau jendela baru yang dibuat saat itu dengan "mendiskusikan" target = "_ blank":
<!-- 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>