<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。请提供您的建议
答案 0 :(得分:2)
您需要更改the contentDisposition
。这是一个HTTP头,因此在使用除Struts2之外的其他技术时也需要这样做(例如,Servlets)。
Content-Disposition有两个对您的案例很有意思的主要值:
attachment
:询问用户下载文件或使用桌面应用程序打开文件所需的操作。
inline
(默认值):尝试使用浏览器插件在新标签页(或窗口)中打开文件。如果找不到该Content-Type的插件,它会要求用户选择一个桌面应用程序来打开它。
然后你只需要:
<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>
详细了解this related answer。