我想使用C从文件名中获取MIME类型。是否可以在不使用包含MIME类型和文件扩展名(即Apache的文件mime.types
)的文本文件的情况下执行此操作?
也许有一个使用文件名获取MIME类型的函数?如果不需要,我宁愿不使用文件扩展名。
[如果有办法,Apache将不需要其mime.types
文件!
桌子必须在某处。它要么在单独的文件中,然后由您的代码解析,要么硬编码到您的软件中。前者越清晰越好解决方案...
也可以通过检查文件的内容(即标头字段,数据结构等)来猜测文件的MIME类型。这是file(1)
程序以及Apache的mod_mime_magic
所使用的方法。在这两种情况下,他们仍然使用单独的文本文件存储查找规则,而不是在程序本身中硬编码任何详细信息。
我刚刚针对我正在从事的项目实施了此操作。 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手册页将非常有用。我知道这是一个老问题,但是我在寻找相同答案时发现了它。这是我的首选解决方案。
据我所知,unix命令file
输出带有选项-i
的mime字符串:
> file -i main.c
main.c: text/x-c charset=us-ascii
如果您想使用Web服务,我只是将其作为mimetype 图标服务的一部分创建的
例如:
它在appengine上运行,因此应该具有高可用性。