如何获得具有 Uri 的文件的 mime 类型?

Posted

技术标签:

【中文标题】如何获得具有 Uri 的文件的 mime 类型?【英文标题】:How I can get the mime type of a file having its Uri? 【发布时间】:2012-09-10 12:44:08 【问题描述】:

我有一个通过图库和相机获得的 Uris 列表。这些 Uris 是这样的:content://media/external/images/media/94。我怎样才能得到它的 mime 类型?

【问题讨论】:

【参考方案1】:

你可以试试

ContentResolver cR = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(cR.getType(uri));

编辑:

mime.getExtensionFromMimeType(cR.getType(uri)) 

返回 -> "jpeg"

cR.getType(uri);

返回“image/jpeg”,即预期值。

【讨论】:

mime.getExtensionFromMimeType(cR.getType(uri)) 返回我 "jpeg"cR.getType(uri) 返回 "image/jpeg" 这是预期值。 这不适用于某些设备..还有其他选择吗? @AditiParikh This answer 为我工作... @BraisGabin 我正在尝试读取 .csv 文件。出于某种原因,我得到cR.getType(uri) 的“text/csv”,但对于ime.getExtensionFromMimeType(cR.getType(uri));,我得到空值。 .csv 只是不支持还是什么? 不,不支持。您可以在此source code 中查看当前支持的扩展程序列表。【参考方案2】:

此方法返回文件的扩展名(jpg、png、pdf、epub 等)。

 public static String getMimeType(Context context, Uri uri) 
    String extension;

    //Check uri format to avoid null
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) 
        //If scheme is a content
        final MimeTypeMap mime = MimeTypeMap.getSingleton();
        extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
     else 
        //If scheme is a File
        //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
        extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());

    

    return extension;

【讨论】:

它对我有用.. 我确实关注了developer.android.com/training/sharing/receive.html @Aaron 谢谢。它适用于非英文文件名。 当方法参数包含 Uri 时,你能解释一下为什么你需要 Uri.fromFile(new File(uri.getPath())) 因为我需要解析空格和特殊字符,即空格应该是 %20。在 uri 路径上使用 new File() 将自动解析这些特殊字符。如果删除此部分,此代码将对包含空格或特殊字符的文件名抛出错误【参考方案3】:

对于ContentUri

ContentResolver cr = context.getContentResolver();
mimeType = cr.getType(contentUri);

对于FileUri

String fileExtension = MimeTypeMap.getFileExtensionFromUrl(fileUri
            .toString());
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
            fileExtension.toLowerCase());

适用于两者,适用于 ContentFile

public String getMimeType(Context context, Uri uri) 
    String mimeType = null;
    if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) 
        ContentResolver cr = context.getContentResolver();
        mimeType = cr.getType(uri);
     else 
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    
    return mimeType;

【讨论】:

小心 MimeTypeMap.getFileExtensionFromUrl(),它似乎无法处理所有文件名。例如,在我的模拟器上,使用相机拍摄的照片在文件名中包含逗号和空格,这会导致此方法返回一个空字符串。如果方法调用失败,我建议回退到手动解析(获取最后一个 '.' 的索引并使用它来获取子字符串)【参考方案4】:

而不是这个:

String type = mime.getExtensionFromMimeType(cR.getType(uri));

这样做:

String type = cR.getType(uri);

你会得到这个:image/jpeg

【讨论】:

仅适用于内容 uris (content://)。不适用于文件 uri (file://) 其实路径对于getType来说并不重要。这只是意图的另一端需要明确设置意图的类型的情况。路径通常不会发生这种情况。【参考方案5】:

我将使用 Kotlin 扩展和返回类型 okhttp3.MediaType 复制 Bhavesh 的答案:

fun Uri.mimeType(contentResolver: ContentResolver)
        : MediaType? 
    if (scheme.equals(ContentResolver.SCHEME_CONTENT)) 
        // get (image/jpeg, video/mp4) from ContentResolver if uri scheme is "content://"
        return contentResolver.getType(this)?.toMediaTypeOrNull()
     else 
        // get (.jpeg, .mp4) from uri "file://example/example.mp4"
        val fileExtension = MimeTypeMap.getFileExtensionFromUrl(toString())
        // turn ".mp4" into "video/mp4"
        return MimeTypeMap.getSingleton()
                .getMimeTypeFromExtension(fileExtension.toLowerCase(Locale.US))
                ?.toMediaTypeOrNull()
    

【讨论】:

【参考方案6】:

例如返回“image/jpeg”

fun Uri.getMimeType(context: Context): String? 
    return when (scheme) 
        ContentResolver.SCHEME_CONTENT -> context.contentResolver.getType(this)
        ContentResolver.SCHEME_FILE -> MimeTypeMap.getSingleton().getMimeTypeFromExtension(
            MimeTypeMap.getFileExtensionFromUrl(toString()).toLowerCase(Locale.US)
        )
        else -> null
    

【讨论】:

以上是关于如何获得具有 Uri 的文件的 mime 类型?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:如何在 ppt 和 pptx 上获得正确的 mime 类型

如何从具有 mime 类型 octet-stream 的没有扩展名的文件中提取文件扩展名?

在哪里可以获得 mime.types 文件的副本? [关闭]

如何使用 php 在文件上设置 mime 类型?

如何设置本地文件的 MIME 类型?

.asp在IIS7中的mime类型是啥??