1. 框架不可知:Servlet 下载文件作为附件
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework:动作下载文件作为附件
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
使用<s:a>
带有OGNL 的标记指向使用标记创建的URL会更好<s:url>
:
<!-- 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>
在上述情况下,您需要将Content-Disposition标头写入响应,指定文件需要下载 ( attachment
) 而不是由浏览器打开 ( inline
)。您还需要指定内容类型,并且您可能希望添加文件名和长度(以帮助浏览器绘制逼真的进度条)。
例如,下载 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...
使用 Struts2(除非您将 Action 用作 Servlet,例如直接流式传输的 hack ),您不需要直接向响应写入任何内容;只需使用Stream 结果类型并在 struts.xml 中对其进行配置即可:示例
<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框架):Servlet(/Action)在浏览器内打开文件
如果你想在浏览器中打开文件,而不是下载它,必须将Content-disposition设置为inline,但目标不能是当前窗口位置;您必须定位由 javascript 创建的新窗口、<iframe>
页面中的一个或使用“讨论”目标 =“_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>