设置流回浏览器的Pdf的文件名

时间:2011-01-28 14:47:19

标签: java pdf servlets iostream httpresponse

我有一个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。你知道我错过了什么吗?

编辑:当内容处置是内联时,有没有办法设置文件名?

6 个答案:

答案 0 :(得分:8)

content-disposition:attachment ....

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

我在java中尝试过一个解决方案,但它确实有用。

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

答案 3 :(得分:1)

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

从RFC开始,如果内联显示,则没有定义客户端必须对文件名信息做什么...

答案 4 :(得分:0)

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

当我设置两个标题时:

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

答案 5 :(得分:-2)

有解决方法可以这样做。我们可以使用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>