从 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 类型的主要内容,如果未能解决你的问题,请参考以下文章