当前位置: 首页 > 知识库问答 >
问题:

从Servlet返回的JSF PDF不能下载[重复]

能正青
2023-03-14

此方法发回一个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();
    }
}

编辑3:正如这里提到的->在新选项卡打开PDF,保存文件给出了错误的文件名,如果处理不是“附件”,文件名似乎被忽略...所以我想我需要考虑另一种方法来做这件事。

谢谢你抽出时间。

共有1个答案

严宸
2023-03-14

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

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

希望能有所帮助。

贝佩

 类似资料:
  • 问题内容: 这是一个非常基本的请求-响应测试。浏览器使用jQuery $ .ajax API将“来自浏览器的hello”发送到servlet,然后servlet接收此消息,然后使用org.json.simple库创建一个JSON对象,并将带有消息“ hello from server”的JSON响应发送回浏览器。 我在本地主机上运行它,只是假设我的IP地址是123.123.12.123,平台是Ub

  • 我不明白为什么这这么难,每个人都有自己的实现... 所以在我的服务器中,我生成了一个文件,我希望用户能够在点击后下载。 所以我设置了请求,服务器成功地接收到了请求,现在,我正在努力将字节数组写入输出。 这是我的回应代码:

  • 我正在等待(从USSD请求中)检索一个值,以便返回它(getUSSD):

  • 以下是图片: 我有一个带有表单的html/jsp页面。 当用户按下提交按钮时,我想将表单中包含的信息发送到servlet,然后servlet将进行一些处理并返回字符串。 然后将该字符串发送到另一个servlet,该servlet将保存一个文件。 我已经将servlet保存到文件中: 我有两个问题: > 如何将值从servlet返回到调用它的HTML页面,并从那里访问它们?

  • 如您所见,它将参数和的和保存在变量中,然后将包含它们的和的eax寄存器保存在变量中,就像函数返回值一样。 这样做是因为函数是用返回值定义的吗?

  • 本文向大家介绍请说明重载和重写的区别,相同参数不同返回值能重载吗?相关面试题,主要包含被问及请说明重载和重写的区别,相同参数不同返回值能重载吗?时的应答技巧和注意事项,需要的朋友参考一下 考察点:重载 重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。