【问题标题】:Set filename of the Pdf that is streamed back to the browser设置流回浏览器的 Pdf 的文件名
【发布时间】:2011-06-17 07:13:32
【问题描述】:

我有一个 Java webapp 创建一个 pdf 并将其流式传输回浏览器。

 byte[] pdf = report.exportPdfToArray(user);
response.setContentType("application/pdf");
response.setHeader("content-disposition", "inline; filename=\"My.pdf\"");
outStream = response.getOutputStream();
outStream.write(pdf);
outStream.flush();
outStream.close();

报告被执行并被发送回浏览器,但我无法控制文件的名称,即使我设置了content-disposition。 我正在使用 Jboss 4.2.1。你知道我错过了什么吗?

编辑:那么当内容处置是内联时,有什么方法可以设置文件名?

【问题讨论】:

  • 某些浏览器,即IE6,有时会在这方面表现得很有趣。我必须在查询字符串的末尾添加类似 ?f=/myfile.pdf 的内容才能使其在 IE6 中工作。

标签: java pdf servlets iostream httpresponse


【解决方案1】:

内容处置:附件 ....

【讨论】:

  • 但我不想下载文件。我想在浏览器中显示。
  • @Atticus:我必须确认我有同样的问题,补充说它不适用于 inline 'inline'(IE 和 Firefox)
  • pdf 接收 servlet 的名称。是否有可能设置页面的(显示pdf的)标题?
  • 在某些 IE 上(不记得确切的版本/操作系统),您还必须确保将文件名添加到您的位置或查询字符串的最后(无论是最后一个)。例如 /myscript.cgi/My.pdf。在这种情况下,My.pdf 是一个假文件(myscript.cgi 被执行)。如果 Apache 配置正确,这是可能的。或者,您也可以在脚本中添加一个伪造的查询字符串,例如:/myscript.cgi?a=1&b=2&f=/My.pdf。应用此 hack 后,它也可以与 content-disposition: inline ... 一起使用
  • 这有点老了,但如果你不想下载文件(而是在浏览器中显示)你可以使用 response.setHeader("Content-Disposition", "filename=\" " + pdf文件名 + "\""); (省略'附件;')
【解决方案2】:

我在java中尝试了一个解决方案,它奏效了。

response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\"");
response.setContentType("application/pdf; name=\"MyFile.pdf\"");
response.getOutputStream().write(pdfAsBytesArray);

【讨论】:

    【解决方案3】:

    MSIE 将使用请求 URL 的路径信息的最后一部分(最后一个 / 之后的部分)作为 Save As 操作的默认文件名。它完全忽略了Content-Disposition 标头的filename 属性。所有其他浏览器都会正确处理该标头。

    您需要将 PDF servlet 的 URL 模式更改为路径映射。 IE。不要将/pdfhttp://example.com/context/pdf 一起使用,而应将/pdf/*http://example.com/context/pdf/report.pdf 一起使用。这样,MSIE 将使用“report.pdf”而不是“pdf”作为 Save As 操作的默认文件名。

    【讨论】:

      【解决方案4】:

      我无法检测到缺陷。您是否检查过其他浏览器/阅读器的行为?

      从 RFC 开始,如果内联显示,客户端对文件名信息的处理没有定义...

      【讨论】:

      • 更糟糕的是,RFC:如果实体被分离并存储在单独的文件中,发件人可能想要建议使用的文件名。如果接收 MUA 将实体写入文件,则建议的文件名应尽可能用作实际文件名的基础。重要的是接收 MUA 不要盲目地使用建议的文件名。应该检查(并且可能更改)建议的文件名,以查看它是否符合本地文件系统约定,不会覆盖现有文件,并且不会出现安全问题...
      • 现在在上述实现中存在缺陷,但在各种 IE 版本中以及 IE 或 acrobat 插件如何处理 HTTP 响应标头。我在使用其他浏览器时没有遇到问题。
      【解决方案5】:

      这很奇怪,但它可能对某人有用(也许有人可以告诉它有什么问题):

      当我设置两个标题时:

      response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size()));
      response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\"");
      

      它不起作用。但是当我更改顺序时,它会按预期工作:

      response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\"");
      response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size()));
      

      【讨论】:

        【解决方案6】:

        有解决方法可以这样做。我们可以使用 iframe,其中 iframe 将在 html 页面中打开,iframe 将保存 pdf 报告,而 html 页面独立于 iframe。我们可以编辑包含 iframe 的 html 页面的标题。

        <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
        <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
        <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <html>
            <head>
                <title>${reportName}</title>
            </head>
            <body>
                <iframe src="/fcWeb/ReportPDFServlet" width="100%" height="100%"></iframe> 
            </body>
        </html>
        

        【讨论】:

        • 这里有一些关于你的代码标记的东西不太写。看看at this guide,然后编辑你的答案来修复它?
        猜你喜欢
        • 2011-07-07
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        • 2014-01-02
        相关资源
        最近更新 更多