【问题标题】:Java MimetypesFileTypeMap always returning application/octet-stream on Android emulatorJava MimetypesFileTypeMap 总是在 Android 模拟器上返回 application/octet-stream
【发布时间】:2011-06-18 20:15:06
【问题描述】:

我正在尝试确定 Android 设备(实际上是我与模拟器一起使用的虚拟设备)上存储的文件的 Mime/媒体类型。我找到了这个资源Get the MIME Type from a File,它推荐了javax.activation.MimetypesFileTypeMap,但是当我运行以下代码时,我得到了所有文件类型的application/octet-stream

MimetypesFileTypeMap map = new MimetypesFileTypeMap();  
File dir = Environment.getExternalStorageDirectory();  
File[] files = dir.listFiles();  
String mimeType;  
for( int i = 0; i < files.length; ++i ) {  
    if( files[i].isDirectory() == false ) {  
        mimeType = map.getContentType(files[i]);  
        if( mimeType.toLowerCase().equals("application/octet-stream") ) {  
            Log.d("mytag", 
                String.format( "Unable to determine the mime type of file %s.",
                files[i].getName()));  
        }   
    }  
}  

我已经使用具有以下扩展名的文件对此进行了测试:jpg、txt、doc、xslx 和 pdf,它们都返回相同的内容。我需要做些什么来初始化地图吗?这个库不能在 Android 上找到支持的 mime 类型列表吗?有没有更好的方法在 Android 上获取文件的 mime 类型?

【问题讨论】:

  • 我也有同样的问题(不涉及android),请参阅此链接stackoverflow.com/questions/6308142/…。我认为我们需要添加一个包含完整 mime 类型列表的资源文件,但尚未尝试过

标签: java android mime-types


【解决方案1】:

也有这个问题。根据 Java Docs MimetypesFileTypeMap 搜索

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

如果您的 Mimetypes 都以“application/octet-stream”的形式出现,这意味着您没有上述文件存在(或者它们存在但不完整)并且没有向您的 MimetypesFileTypeMap 实例添加任何条目。

解决...

MimetypesFileTypeMap mimetypes 规范格式

# comments start with hash marks
# format is <mime type> <space separated file extensions>
# for example, for an image mime type and a text mime type
image png tif jpg jpeg bmp
text  txt text rtf TXT
# either place those lines within the files specified by 2-4 or

MimetypesFileTypeMap mtftp = new MimetypesFileTypeMap();
mtftp.addMimeTypes("image png tif jpg jpeg bmp")

# and it's as easy as that!

【讨论】:

  • 根据 MimetypesFileTypeMap 文档,确切的文件格式是这样的:** text/plain txt text TXT **(对不起,我无法格式化。:()
【解决方案2】:

我也遇到了同样的问题,你可以在 Headers 中添加正确的 contentType 来返回,你可以这样做:

public MediaType getContentType(String fileName) {
    MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
    fileTypeMap.addMimeTypes("application/msword doc");
    fileTypeMap.addMimeTypes("application/vnd.openxmlformats-officedocument.wordprocessingml.document docx");
    fileTypeMap.addMimeTypes("image/jpeg jpg jpeg");
    fileTypeMap.addMimeTypes("application/vnd.oasis.opendocument.text odt");
    fileTypeMap.addMimeTypes("application/pdf pdf");
    fileTypeMap.addMimeTypes("image/png png");
    MediaType mediaType = MediaType.parseMediaType( fileTypeMap.getContentType(fileName));
    return mediaType;
}

// Additional MIME types
fileTypeMap.addMimeTypes("application/atom+xml atom");
fileTypeMap.addMimeTypes("application/msword doc dot");
fileTypeMap.addMimeTypes("application/mspowerpoint ppt pot");
fileTypeMap.addMimeTypes("application/msexcel xls");
fileTypeMap.addMimeTypes("application/pdf pdf");
fileTypeMap.addMimeTypes("application/rdf+xml rdf rss");
fileTypeMap.addMimeTypes("application/x-vnd.openxmlformat docx docm dotx dotm");
fileTypeMap.addMimeTypes("application/x-vnd.openxmlformat xlsx xlsm");
fileTypeMap.addMimeTypes("application/x-vnd.openxmlformat pptx pptm potx");
fileTypeMap.addMimeTypes("application/x-javascript js");
fileTypeMap.addMimeTypes("application/x-rar-compressed rar");
fileTypeMap.addMimeTypes("application/x-textedit bat cmd");
fileTypeMap.addMimeTypes("application/zip zip");
fileTypeMap.addMimeTypes("audio/mpeg mp3");
fileTypeMap.addMimeTypes("image/bmp bmp");
fileTypeMap.addMimeTypes("image/gif gif");
fileTypeMap.addMimeTypes("image/jpeg jpg jpeg jpe");
fileTypeMap.addMimeTypes("image/png png");
fileTypeMap.addMimeTypes("text/css css");
fileTypeMap.addMimeTypes("text/csv csv");
fileTypeMap.addMimeTypes("text/html htm html");
fileTypeMap.addMimeTypes("text/xml xml");
fileTypeMap.addMimeTypes("video/quicktime qt mov moov");
fileTypeMap.addMimeTypes("video/mpeg mpeg mpg mpe mpv vbs mpegv");
fileTypeMap.addMimeTypes("video/msvideo avi");
fileTypeMap.addMimeTypes("video/mp4 mp4");
fileTypeMap.addMimeTypes("video/ogg ogg");

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2011-02-14
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多