【发布时间】:2020-04-22 02:44:39
【问题描述】:
我有一个表单,一旦完成就会打开一个新选项卡并调用我的 bean 方法 annonceReturn()。
此方法发回一个 pdf 文件。问题是当我用 _blank 打开一个新选项卡时,URL 以 .xhtml 结尾。甚至文件名也显示为在我的示例“list.xhtml”(URL 的最后一部分)中。问题是我无法下载此文件,因为它不被视为 pdf 文件。
这是我的 xhtml 文件:
<h:form id="form">
<p:commandButton id="envoiRetour" onclick="this.form.target = '_blank';"
actionListener="#{returnCtrl.announceReturn()}"
value="Open PDF in new tab"
ajax="false" />
</h:form>
这是 returnCtrl.annonceReturn() 方法:
public void announceReturn() throws MalformedURLException, FileNotFoundException, DocumentException, BadElementException, IOException, InterruptedException {
String referenceAnnouncement = "C:/Users/path_to_my_pdf_file.pdf";
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(new FileInputStream(referenceAnnouncement), 10240);
response.reset();
response.setHeader("Content-type", "application/pdf");
response.setContentLength((int)new File(referenceAnnouncement).length());
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Content-disposition", "inline; filename=" + "file.pdf");
response.setHeader("pragma", "public");
output = new BufferedOutputStream(response.getOutputStream(), 10240);
byte[] buffer = new byte[10240];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.flush();
} finally {
output.close();
input.close();
}
}
如何在新标签页中打开此 PDF 并能够下载?
当我尝试下载它时,它说存在网络错误(并尝试将其保存为 xhtml 文件)。
编辑:这是帮助我的问题:How to open a PDF file in a new tab
EDIT 2:问题不在于 PDF 不显示。问题是它显示在新选项卡中,但是当我尝试下载它时,资源管理器希望将其保存为 XHTML 文件。
EDIT 3 : 如此处提到的 -> Open PDF in new tab, saving file gives wrong file name 如果处置不是“附件”,似乎文件名被忽略......所以我想我需要考虑另一种方法来做到这一点。
感谢您的宝贵时间。
【问题讨论】:
-
servlet 在哪里? (然后是使用的 jsf servlet)以及您尝试了 stackoverflow 中的许多 Q/A 中的哪一个,为什么它们没有帮助。您是否调查过“服务器错误”?
-
试过
p:fileDownload(link)? -
你想让我编辑我的帖子以链接网站的所有链接,解释如何在我读过的新标签中下载或打开 pdf 吗?
-
使用 Servlet 而不是 JSF 支持 bean 可以解决您的问题。具有讽刺意味的是,您在问题的当前标题中提到您使用的是 Servlet,但实际上您使用的是 JSF 支持 bean ..
-
没有。这是有问题的客户端。在 Chrome 等普通浏览器中一切正常。这与使用的服务器端框架无关。在使用 PHP、C、Python 或其他任何东西而不是 Java 时,您会遇到完全相同的问题。
标签: pdf internet-explorer jsf download