【问题标题】:Why does MimetypesFileTypeMap always return "application/octet-stream" for PNG file?为什么 MimetypesFileTypeMap 总是为 PNG 文件返回“application/octet-stream”?
【发布时间】:2016-03-13 23:06:00
【问题描述】:

我正在尝试使用javax.activation.MimetypesFileTypeMap 来获取内容类型。

对于字符串“image.png”,它总是返回“application/octect-stream”......它不应该返回类似“image/png”的东西吗?

javax.activation.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType("image.png");

【问题讨论】:

标签: java mime


【解决方案1】:

我改进了 MimetypesFileTypeMap(内容类型探测对于 Web 服务来说太慢了):

package com.github.jjYBdx4IL.utils.text;

import java.io.IOException;
import java.io.InputStream;

import javax.activation.MimetypesFileTypeMap;

//CHECKSTYLE:OFF
public class MimeType {

    public static MimetypesFileTypeMap MAP = createMap();

    /**
     * 
     * @return a vastly improved mimetype map
     */
    public static MimetypesFileTypeMap createMap() {
        try (InputStream is = MimeType.class.getResourceAsStream("mimetypes.txt")) {
            return new MimetypesFileTypeMap(is);
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }

    public static String get(String fileName) {
        return get(fileName, null);
    }

    public static String get(String fileName, String charset) {
        String mimeType = MAP.getContentType(fileName.toLowerCase());
        if (charset != null && (mimeType.startsWith("text/") || mimeType.contains("javascript"))) {
            mimeType += ";charset=" + charset.toLowerCase();
        }
        return mimeType;
    }


}

https://github.com/jjYBdx4IL/misc/blob/master/text-utils/src/main/java/com/github/jjYBdx4IL/utils/text/MimeType.java

application/javascript js
application/msword doc docx docm
application/pdf pdf
application/postscript ai eps ps
application/rss+xml rss
application/rtf rtf
application/vnd.ms-excel xls xlsx xlsm XLS
application/vnd.ms-powerpoint ppt pps pot pptx pptm
application/vnd.oasis.database odb
application/vnd.oasis.opendocument.text odt
application/vnd.oasis.presentation odp
application/vnd.oasis.spreadsheet ods
application/vnd.oasis.text odt
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/x-awk awk
application/x-blender blend
application/x-cd-image iso
application/x-compress zip gz tar rar
application/x-deb deb
application/x-font-otf otf OTF
application/x-font-ttf ttf TTF
application/x-java-applet class
application/x-java-archive jar
application/xml xml
application/x-ms-dos-executable exe msi
application/x-perl pl
application/x-php php
application/x-rpm rpm
application/x-sharedlib o
application/x-shellscript sh
application/x-tar tar
application/x-texinfo texinfo texi
application/x-tex tex
application/x-trash autosave
application/x-troff t tr roff
application/x-vnd.oasis.opendocument.spreadsheet ods
application/zip zip
audio/ac3 ac3
audio/basic au
audio/midi midi mid
audio/mpeg mp3 mpeg3
audio/x-aifc aifc
audio/x-aiff aif aiff
audio/x-generic wav wma mp3 ogg
audio/x-mpeg mpeg mpg
audio/x-wav wav
image/gif gif GIF
image/ief ief
image/jpeg jpeg jpg jpe JPG
image/png png PNG
image/svg+xml svg svgz
image/tiff tiff tif
image/x-eps eps
image/x-generic bmp jpg jpeg png tif tiff xpm wmf emf
image/x-xwindowdump xwd
text/css css
text/csv csv
text/html html htm HTML HTM
text/plain txt text TXT TEXT
text/richtext rtx
text/rtf rtf
text/tab-separated-values tsv tab
text/x-bibtex bib
text/x-c++hdr h
text/x-csrc c
text/x-c++src cpp c++
text/x-java java
text/x-log log
text/xml xml XML osm
text/x-pascal pas
text/x-po po pot
text/x-python py
text/x-sql sql
text/x-tcl tcl
text/x-tex tex
video/mpeg mpeg mpg mpe mpv vbs mpegv
video/msvideo avi
video/quicktime qt mov moov
video/x-generic wmv mpeg mp4 ogv swf mov dvd osp
video/x-msvideo avi

https://github.com/jjYBdx4IL/misc/blob/master/text-utils/src/main/resources/com/github/jjYBdx4IL/utils/text/mimetypes.txt

我只是将所有我可以通过谷歌快速找到的东西汇总在一起,所以我不能说所有这些类型是否真的有效。

【讨论】:

【解决方案2】:

为了获取你可以使用的 contentType

public String getFileContentType(String fileName) {
    String fileType = "Undetermined";
    final File file = new File(fileName);
    try
    {
        fileType = Files.probeContentType(file.toPath());
    }
    catch (IOException ioException)
    {
        System.out.println(
                "ERROR: Unable to determine file type for " + fileName
                        + " due to exception " + ioException);
    }
    return fileType;
}

【讨论】:

    【解决方案3】:

    请参阅javax.activation.MimetypesFileTypeMap 的 Javadocs。该方法按一定顺序查找名为.mime.types的文件:

    MIME 类型文件搜索顺序:

    MimetypesFileTypeMap 在用户系统的不同位置查找 MIME 类型文件条目。当请求在 MimetypesFileTypeMap 中搜索 MIME 类型时,它会按以下顺序搜索 MIME 类型文件:

    1. 以编程方式将条目添加到 MimetypesFileTypeMap 实例。
    2. 用户主目录中的文件.mime.types
    3. 文件<java.home>/lib/mime.types
    4. 名为META-INF/mime.types的文件或资源。
    5. 名为META-INF/mimetypes.default 的文件或资源(通常仅在activation.jar 文件中找到)。

    如果没有找到文件,getContentType 方法返回application/octet-stream

    根据指定的文件名返回 MIME 类型。 MIME 类型条目按照上述MIME 类型文件搜索顺序 进行搜索。如果没有找到条目,则返回类型“application/octet-stream”。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2012-11-25
      • 2011-02-14
      • 2011-01-23
      • 2017-11-01
      • 2011-09-19
      • 2011-06-17
      相关资源
      最近更新 更多