在我的应用程序中,我想提供文件下载功能。我将文件类型设置为response.setContentType。如何为几乎所有已知文件类型设置内容类型?有什么简单的方法吗?或者我需要像现在一样手动设置它,如下所示。
if (pictureName.indexOf("jpg") > 0) {
res.setContentType("image/jpg");
} else if (pictureName.indexOf("gif") > 0) {
res.setContentType("image/gif");
} else if (pictureName.indexOf("pdf") > 0) {
res.setContentType("application/pdf");
res.setHeader("Content-Disposition", "inline; filename=\"" + pictureName + "\"");
} else if (pictureName.indexOf("html") > 0) {
res.setContentType("text/html");
} else if (pictureName.indexOf("zip") > 0) {
res.setContentType("application/zip");
res.setHeader("Content-Disposition", "attachment; filename=\"" + pictureName + "\"");
}
谢谢:)
答案 0 :(得分:10)
查看javax.activation.MimetypesFileTypeMap(作为Java6的一部分,可以在以前版本下载)。它有一个方法返回给定文件名的mime类型。
我自己从未尝试过使用它,而且你可能还需要提供一个mime类型列表。值得一看。
答案 1 :(得分:1)
给出@skaffman在使用Servlet时列出的实例:
String fileName = "c:/temp/URL.txt";
MimetypesFileTypeMap mimetypesFileTypeMap=new MimetypesFileTypeMap();
response.setContentType(mimetypesFileTypeMap.getContentType(fileName));
response.getOutputStream().write(Files.readAllBytes(Paths.get(fileName)));
答案 2 :(得分:1)
在 Java 1.7 中添加了 FileTypeDetector 类,允许探测文件以猜测其类型。
具体来说,您可以使用 Files.probeContentType。一些信息here。这是一个代码示例:
File f = new File("c:\\temp\\myFile.mp4");
resp.setHeader("Content-Disposition", "attachment; filename=\"" + f.getName() + "\"");
resp.setContentType(Files.probeContentType(f.toPath()));
根据文档,probeContentType 高度特定于实现 并且可以简单地检查文件名,它可以使用文件属性,或者它可以检查文件中的字节。
正如 skaffman 回答的那样,还有 MimetypesFileTypeMap,相比之下,它通过文件扩展名提供文件的数据类型。
答案 3 :(得分:0)
URLConnection.getFileNameMap().getContentTypeFor(string)
适用于txt,pdf,avi;没有doc,odt,mp3 ......