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

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

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

内容 – 处置:附件….

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

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

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

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

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

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

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

当我设置两个标题时:

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

有解决方法可以这样做。 我们可以使用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" %>   ${reportName}