【问题标题】:Get MIME type from filename in C从 C 中的文件名获取 MIME 类型
【发布时间】:2010-09-30 05:35:00
【问题描述】:

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

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

【问题讨论】:

    标签: c mime-types unix


    【解决方案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 服务器,我会尝试这个。 :)
      猜你喜欢
      • 2016-05-19
      • 2010-11-05
      • 2015-06-13
      • 2013-11-10
      • 2013-09-11
      • 2014-08-06
      相关资源
      最近更新 更多