从 C 中的文件名获取 MIME 类型

Posted

技术标签:

【中文标题】从 C 中的文件名获取 MIME 类型【英文标题】:Get MIME type from filename in C 【发布时间】:2010-09-30 05:35:00 【问题描述】:

我想使用 C 从文件名中获取 MIME 类型。 有没有办法在不使用包含 MIME 类型和文件扩展名的文本文件(即 Apache 的文件 mime.types)的情况下做到这一点?

也许有一个函数可以使用文件名获取 MIME 类型?如果不需要,我宁愿不使用文件扩展名。

【问题讨论】:

【参考方案1】:

我刚刚为我正在处理的一个项目实现了这个。 libmagic 是您正在寻找的。在 RHEL/CentOS 上,它由 file-libs 和 file-devel 提供。 Debian/Ubuntu 似乎是 libmagic-dev。

http://darwinsys.com/file/

下面是一些示例代码:

#include <stdio.h>
#include <magic.h>

int main(int argc, char **argv)
  const char *mime;
  magic_t magic;

  printf("Getting magic from %s\n", argv[1]);

  magic = magic_open(MAGIC_MIME_TYPE); 
  magic_load(magic, NULL);
  magic_compile(magic, NULL);
  mime = magic_file(magic, argv[1]);

  printf("%s\n", mime);
  magic_close(magic);

  return 0;

下面的代码使用默认的魔法数据库/usr/share/misc/magic。一旦你安装了开发包,libmagic 手册页就很有帮助。我知道这是一个老问题,但我在寻找相同答案时发现了它。这是我的首选解决方案。

【讨论】:

【参考方案2】:

如果有办法做到这一点,Apache 就不需要它的mime.types 文件!

桌子必须在某个地方。它要么位于由您的代码解析的单独文件中,要么被硬编码到您的软件中。前者越清晰越好……

还可以通过检查文件的内容(即标题字段、数据结构等)来猜测文件的 MIME 类型。这是 file(1) 程序和 Apache 的 mod_mime_magic 使用的方法.在这两种情况下,他们仍然使用单独的文本文件来存储查找规则,而不是在程序本身中硬编码任何细节。

【讨论】:

太糟糕了。但是 Apache 不能在不检查文件扩展名的情况下找出 mimetype 吗?我知道我的一些朋友输入了domain.tld/picture,他们的 Apache 返回了 JPG。那是因为 mimetype 在 JPG 中吗?感谢您的快速答复! Unix 实用程序“file”通过检查标头、数据结构等对文件类型做出(非常)好的猜测。但它使用单独的文件(通常是 /usr/share/file/magic)存储查找启发式! Apache 的 mod_mime_magic 工作方式相同。【参考方案3】:

据我所知,unix 命令file 输出带有选项-i 的mime 字符串:

> file -i main.c
main.c: text/x-c charset=us-ascii

【讨论】:

如何使用 C 语言? 要么直接调用system("file -i" pszFilename),要么查看file的代码,重新构建解析/usr/share/file/magic所需的部分 很好,一旦我可以再次访问我的 UNIX 服务器,我会尝试这个。 :)

以上是关于从 C 中的文件名获取 MIME 类型的主要内容,如果未能解决你的问题,请参考以下文章

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

Laravel 4 中 File::mime() 的替换(从文件扩展名中获取 mime 类型)

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

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

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

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