有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中设置文件下载的内容类型

在我的应用程序中,我喜欢提供文件下载功能。我将文件类型设置为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 + "\"");
}

共 (4) 个答案

  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. # 2 楼答案

    Java1.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. # 3 楼答案

    看看javax.activation.MimetypesFileTypeMap(作为Java6的一部分提供,可以下载到以前的版本中)。它有一个返回给定文件名的mime类型的方法

    不过,我自己从未尝试过使用它,而且您可能仍然需要为它提供一个mime类型列表。不过值得一看

  4. # 4 楼答案

    URLConnection.getFileNameMap().getContentTypeFor(string)适用于txt、pdf、avi;文档、odt、mp3失败