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

问题描述 投票:8回答:6

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

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

c mime-types unix
6个回答
6
投票

[如果有办法,Apache将不需要其mime.types文件!

桌子必须在某处。它要么在单独的文件中,然后由您的代码解析,要么硬编码到您的软件中。前者越清晰越好解决方案...

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


10
投票

我刚刚针对我正在从事的项目实施了此操作。 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手册页将非常有用。我知道这是一个老问题,但是我在寻找相同答案时发现了它。这是我的首选解决方案。


6
投票

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

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

0
投票

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

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

事实是它没有使用GPL之类的许可证,也没有任何类似的许可证。


0
投票

如果您想使用Web服务,我只是将其作为mimetype 图标服务的一部分创建的

http://stdicon.com/

例如:

http://stdicon.com/ext/html

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


0
投票

您正在寻找的只是MegaMimesMegaMimes是一种模仿型C库,不需要网络或Web服务,不需要外部文件,不需要依赖项,完全用C编写,使用起来非常简单。它只是您和您的代码。它也确实可扩展。您可以添加自己的mime类型并进行编译。 MegaMimes

© www.soinside.com 2019 - 2024. All rights reserved.