我有一个表单,一旦完成,它将打开一个新选项卡并调用我的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文件)。
感谢您的时间。
这是我的代码,希望对您有所帮助。
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
File temp = File("./path/abc.pdf");
temp.deleteOnExit();
ec.responseReset();
ec.setResponseContentType("application/pdf");
ec.setResponseContentLength((int)temp.length());
ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + temp.getName() + "\""); //inline;
OutputStream output = ec.getResponseOutputStream();
Files.copy(temp.toPath(), output);
fc.responseComplete();
尝试使用“附件”而不是“内联”来强制浏览器保存文件(而不是尝试使用关联的插件打开-如果已安装)
response.setHeader("Content-disposition", "attachment; filename=" + "file.pdf");
希望有帮助。
哔哔