如何在不基于扩展的 IOS 中获取 Mime 类型

Posted

技术标签:

【中文标题】如何在不基于扩展的 IOS 中获取 Mime 类型【英文标题】:How Can I get Mime Type in IOS which is not based on extension 【发布时间】:2012-04-05 18:20:48 【问题描述】:

我们知道我们可以从文件的扩展名中获取文件的 MIME TYPE,但并不完全正确。例如,我们更改了文件的扩展名,我们会得到错误的 mime 类型。 我们也知道通过 C# 中的文件签名获取 mime 类型的方式,(使用 urlmon.dll Using .NET, how can you find the mime type of a file based on the file signature not the extension ,我的问题是我们如何在 ios 中获得确切的 mime 类型,无论文件的扩展名是否更改通过某人,我们可以获得正确的 mime 类型。

感谢您的关注~!

【问题讨论】:

iOS 上没有file signature 这样的概念。 感谢您的评论。您能告诉我在获得文件路径时如何准确地获得正确的 mime 类型。 【参考方案1】:

你能告诉我当我得到一个正确的 mime 类型 文件的路径。

iOS 使用Uniform Type Identifiers (UTI) 的概念来处理文档类型。

NSString *path; // contains the file path

// Get the UTI from the file's extension:

CFStringRef pathExtension = (__bridge_retained CFStringRef)[path pathExtension];
CFStringRef type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, NULL);
CFRelease(pathExtension);

// The UTI can be converted to a mime type:

NSString *mimeType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass(type, kUTTagClassMIMEType);
if (type != NULL)
    CFRelease(type);

您应该考虑直接将 UTI 用于您的目的,而不是将它们转换为功能较弱的 mime 类型。

【讨论】:

它不会给出正确的 mimetype。它甚至没有检查实际文件。它只是将 扩展名转换为 mimetype @Johnnywho 这个答案是关于 从路径 获取 mime 类型(如明确说明并由 OP 在评论中要求)。 但带有标题的原始问题与扩展名不基于的mime类型有关。这样,您的回答具有误导性,我浪费了时间尝试您的代码。您应该明确声明路径必须具有扩展名。您的答案中没有一部分是这样说的。 我知道这是一个古老的讨论,但我刚刚通过谷歌找到了它,它很有帮助。请注意,您还需要:#import <MobileCoreServices/MobileCoreServices.h>,并添加 MobileCoreServices 框架,使其工作。 @NikolaiRuhe 为什么不使用__bridge 而不是__bridge_retained?如果您使用__bridge,则不需要CFRelease(pathExtension)

以上是关于如何在不基于扩展的 IOS 中获取 Mime 类型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 - 从文件扩展名中获取 MIME 类型

从 C++ 中的扩展中获取 MIME 类型

从文件扩展名中获取 MIME 类型

从文件扩展名中获取 MIME 类型

在 iOS 上识别我的不带文件扩展名的 mime 类型

在没有 PECL 扩展的 PHP5 中获取本地文件的 MIME 类型?