从Servlet返回时无法下载JSF PDF

问题描述 投票:0回答:2

我有一个表单,一旦完成,它将打开一个新选项卡并调用我的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文件)。

感谢您的时间。

java jsf
2个回答
0
投票

这是我的代码,希望对您有所帮助。

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();

0
投票

尝试使用“附件”而不是“内联”来强制浏览器保存文件(而不是尝试使用关联的插件打开-如果已安装)

 response.setHeader("Content-disposition", "attachment; filename=" + "file.pdf");

希望有帮助。

哔哔

© www.soinside.com 2019 - 2024. All rights reserved.