上下文: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只是一个例子。
有什么想法吗?
答案 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也可以设置正确的内容类型。