2010-08-08 76 views
2

我正在使用Jetty编写一个快速且肮脏的静态文件服务器。我需要设置的Content-Type每个响应:HttpServletRequest:如何确定所请求资产的内容类型

HttpServletResponse.setContentType("content/type"); 

对于给定的文件要求,我该如何可靠地确定哪些内容类型设置?这是检查文件扩展名的问题,还是有更复杂的方法? (例如,如果有哪个没有文件扩展名,或扩展不反映内容类型?)

感谢理查德

+0

我知道两个解决方案: - [javax.activation.MimetypesFileTypeMap](http://download-llnw.oracle.com/javase/6/docs/api/javax/activation/MimetypesFileTypeMap.html)JavaBeans激活框架(似乎可用于Java SE 6?) - [Apache Tika](http://tika.apache.org/)[有趣的教程](http://www.rgagnon.com/javadetails/java-0487.html)关于这个问题,我有很多不同的解决方案,我没有尝试。 – Kartoch 2010-08-08 10:08:49

+0

你应该看看这个库。它做了很多东西(文件扩展名,魔术数据和内容嗅探)来确定内容类型:[Mime Type Detection Utility](http://sourceforge.net/projects/mime-util/) – naikus 2010-08-08 16:18:44

+0

不确定这是否适合你的需求,但我最近发布了我的[SimpleMagic](http://256.com/sources/simplemagic/)包,它实现了与Unix文件(1)命令相同的功能。它使用内部配置文件,或者可以读取'/ etc/magic','/ usr/share/file/magic'或其他magic(5)文件并确定来自'File','InputStream'或'byte []'。 [github sources](https://github.com/j256/simplemagic)的位置,javadocs和一些文档可以从[主页](http://256.com/sources/simplemagic/)获得。使用SimpleMagic,你可以做类似 – Gray 2013-05-16 13:51:00

回答

1

你就不能检查请求标题Content-Type并设置回应?

我不知道你打算支持哪种客户端,但如果他们是浏览器,我想你应该没问题。如果你控制客户端,不管怎样他们都会向你发送这个头文件是一个好习惯。

祝你好运!

+0

我支持的客户端只有浏览器。这是有趣的建议,我会调查。 – 2010-08-09 11:14:01

0

由于您在您的问题中使用了HttpServletResponse对象,我假设您的控制器中有可用的ServletContext。我刚刚使用servletContext中的方法解决了这个问题。

由于您正在编写文件服务器,因此您可以在ServletContext的getMimeType方法中传递文件的路径,并且它应该返回mimeType(如果它可以确定它)。

String path = "/js/example.js"; 
String mimeType = getServletContext().getMimeType(path); 
resp.setContentType(mimeType); // HttpServletResponse object 

注:设置在该特定示例中的内容类型为 “application-X/JavaScript的”。

其他信息:我相信这个解决方案还假定您的文件存储在ServletContext的访问的位置。如果不是,那么其他解决方案之一可能是最好的。