我有一个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。你知道我错过了什么吗?
编辑:当内容处置是内联时,有没有办法设置文件名?
答案 0 :(得分:8)
content-disposition:attachment ....
答案 1 :(得分:3)
MSIE将使用请求URL的路径信息的最后部分(最后/
之后的部分)作为另存为操作的默认文件名。它完全忽略了filename
标题的Content-Disposition
属性。所有其他浏览器都正确处理该标头。
您需要将PDF servlet的URL模式更改为路径映射。即不要将/pdf
与http://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>