从C中的filename获取MIME类型

时间:2009-01-08 08:52:57

标签: c mime-types unix

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

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

5 个答案:

答案 0 :(得分:9)

我刚刚为我正在工作的项目实施了这个。 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。一旦安装了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)

您可以从此处下载“文件”工具的源代码:

ftp://ftp.astron.com/pub/file/

问题在于它不使用像许可证那样的GPL,或者任何用于此类的任何GPL。

答案 4 :(得分:0)

如果您想使用网络服务,我只是将其创建为我的mimetype&lt; - &gt;的一部分。图标服务

http://stdicon.com/

例如:

http://stdicon.com/ext/html

它在appengine上运行,因此它应具有高可用性。