<action name="PDF" class="OwnerDetail" method="createPDF">
<result name="success" type="stream">
<param name="contentType">application/pdf</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="RegistrationSummaryReport.pdf"</param>
<param name="bufferSize">1024</param>
</result>
</action>
上面的代码生成 PDF 作为附件。但是我需要在新窗口中打开PDF。请提供您的建议
更改contentDisposition
。这是一个HTTP头,所以当使用Struts2以外的其他技术(例如Servlets)时也需要这样做。
内容处置有两个主要值,对您的案例感兴趣:
attachment
:询问用户在下载文件或使用桌面应用程序打开文件之间需要执行的操作。inline
(默认):尝试使用浏览器插件在新选项卡(或窗口)中打开文件。如果未找到该内容类型的插件,它将要求用户选择一个桌面应用程序来打开它。
然后,您只需要:
<param name="contentDisposition">
inline;filename="RegistrationSummaryReport.pdf"
</param>
或者只是
<param name="contentDisposition">
filename="RegistrationSummaryReport.pdf"
</param>
编辑
正如@BrunoLowagie在评论中所建议的那样,我可能省略了一个重要的部分。
虽然确实需要inline
才能在浏览器中打开文档,但也需要进一步的步骤(我认为这是理所当然的,尽管可能不是)才能在另一个选项卡/窗口中打开该文档,而不是在当前选项卡上,:您需要通过指定 target
属性来调用操作, 或者通过使用 JavaScript window.open()
<s:url var="myUrl" action="downloadPdf" namespace="/foobar" />
<!-- In a new Tab/Window without javascript -->
<s:a href="%{myUrl} target="_blank">
download
</s:a>
<!-- In a new Tab/Window with javascript -->
<s:a href="javascript:window.open('%{myUrl}');>
download
</s:a>
阅读有关此相关答案的更多信息。