我想使用C从文件名中获取MIME类型。
有没有办法在不使用包含MIME类型和文件扩展名的文本文件(即Apache的文件mime.types
)的情况下执行此操作?
也许有一个函数可以使用文件名获取MIME类型?如果我不需要,我宁愿不使用文件扩展名。
答案 0 :(得分:9)
我刚刚为我正在工作的项目实施了这个。 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。一旦安装了dev软件包,libmagic手册页就会非常有用。我知道这是一个古老的问题,但是我找到了同样的答案。这是我的首选解决方案。
答案 1 :(得分:6)
据我所知,unix命令file
输出带有-i
选项的mime字符串:
> file -i main.c
main.c: text/x-c charset=us-ascii
答案 2 :(得分:5)
如果有办法,Apache就不需要mime.types
文件了!
桌子必须在某个地方。它可以在一个单独的文件中,由您的代码解析,也可以硬编码到您的软件中。前者更清晰,更好的解决方案......
还可以通过检查文件的内容(即标题字段,数据结构等)来猜测文件的MIME类型。这是file(1)
程序和Apache的{mod_mime_magic
程序使用的方法。 {1}}。在这两种情况下,他们仍然使用单独的文本文件来存储查找规则,而不是在程序本身中硬编码任何细节。
答案 3 :(得分:0)
答案 4 :(得分:0)
如果您想使用网络服务,我只是将其创建为我的mimetype&lt; - &gt;的一部分。图标服务
例如:
它在appengine上运行,因此它应具有高可用性。