设置流回浏览器的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}