PDF文件在浏览器中显示为“text / html”

时间:2011-10-20 07:15:06

标签: apache java-ee content-type

上下文:Apache在Weblogic应用程序服务器前面。

用户可以通过我们的J2EE应用程序下载PDF文件。 仅使用Weblogic,PDF就可以在所有浏览器的插件中正确显示。

但是对于Apache,HTTP响应头中有Content-type "text/html"(例如我们在Firebug中可以看到),这导致Web浏览器以文本形式内联显示文件。 我们从Java代码发送的HTTP头中发送的内容: Content-Disposition - > PDF的名称,以及Expires - > 0

没有设置Content-type(为了简化,假设我们不知道应用程序中文件的类型),我们无法更改它。

似乎Apache覆盖了它并设置了自己的Content-type,为什么? 我们尝试在DefaultType none中设置httpd.conf但没有效果。

当然,对于所有文件类型都是一样的,PDF只是一个例子。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

昨天我遇到了同样的问题。就我而言,我发现当我(无意中)没有在我的WebLogic应用程序的HTTP响应中设置任何Content-Type值时,Apache会“帮助”注意到这一点,并设置一个带有{{1的Content-Type标头 - 即使我返回客户端的内容是二进制PDF。

这导致原始二进制PDF内容在客户端浏览器中显示,就像它是纯文本一样。

可以在Apache中抑制此行为。但是,就我而言,我所提出的解决方案是在提交响应之前在HTTP响应对象上设置Content-Type。

(在我的应用程序中,在WebLogic上运行的Oracle ATG Commerce应用程序,在响应对象的outputStream上调用text/html之后对DynamoHttpServletResponse.setContentType()DynamoHttpServletResponse.setHeader()的任何调用都被静默忽略。)< / p>

答案 1 :(得分:0)

为什么不尝试查找文件类型并填写Content-type。任何其他方式都是非标准的,可能会根据浏览器给您带来问题。

可以使用

确定文件类型
InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);

答案 2 :(得分:0)

也许apache模块mime_magic有帮助吗?

如果没有,那么您可以将文件保存在www_root内的某个目录中,并将重定向发送到导致该文件的浏览器。这样,只有apache自己发回文件,并且使用mime_magic也可以设置正确的内容类型。