【发布时间】:2010-09-30 05:35:00
【问题描述】:
我想使用 C 从文件名中获取 MIME 类型。
有没有办法在不使用包含 MIME 类型和文件扩展名的文本文件(即 Apache 的文件 mime.types)的情况下做到这一点?
也许有一个函数可以使用文件名获取 MIME 类型?如果不需要,我宁愿不使用文件扩展名。
【问题讨论】:
标签: c mime-types unix
我想使用 C 从文件名中获取 MIME 类型。
有没有办法在不使用包含 MIME 类型和文件扩展名的文本文件(即 Apache 的文件 mime.types)的情况下做到这一点?
也许有一个函数可以使用文件名获取 MIME 类型?如果不需要,我宁愿不使用文件扩展名。
【问题讨论】:
标签: c mime-types unix
我刚刚为我正在处理的一个项目实现了这个。 libmagic 是您正在寻找的。在 RHEL/CentOS 上,它由 file-libs 和 file-devel 提供。 Debian/Ubuntu 似乎是 libmagic-dev。
下面是一些示例代码:
#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 手册页就很有帮助。我知道这是一个老问题,但我在寻找相同答案时发现了它。这是我的首选解决方案。
【讨论】:
如果有办法做到这一点,Apache 就不需要它的mime.types 文件!
桌子必须在某个地方。它要么位于由您的代码解析的单独文件中,要么被硬编码到您的软件中。前者越清晰越好……
还可以通过检查文件的内容(即标题字段、数据结构等)来猜测文件的 MIME 类型。这是 file(1) 程序和 Apache 的 mod_mime_magic 使用的方法.在这两种情况下,他们仍然使用单独的文本文件来存储查找规则,而不是在程序本身中硬编码任何细节。
【讨论】:
据我所知,unix 命令file 输出带有选项-i 的mime 字符串:
> file -i main.c
main.c: text/x-c charset=us-ascii
【讨论】:
system("file -i" pszFilename),要么查看file的代码,重新构建解析/usr/share/file/magic所需的部分