在 Windows 上查找文件的 MIME 类型

Posted

技术标签:

【中文标题】在 Windows 上查找文件的 MIME 类型【英文标题】:Finding a MIME type for a file on windows 【发布时间】:2011-02-02 16:33:04 【问题描述】:

有没有办法在 Windows 上使用一些系统调用来获取文件的 MIME 类型?我正在用 C++ 编写一个 IIS 扩展,所以它必须可以从 C++ 调用,如果有一些功能暴露,我确实可以访问 IIS。显然,IIS 本身必须能够做到这一点,但我的谷歌搜索一直无法找出如何。我确实在 SO 上找到了 this .net 相关问题,但这并没有给我太多希望(因为那里既没有提到好的解决方案也没有提到 C++ 解决方案)。

我需要它,以便我可以使用我的应用程序中的适当内容类型来提供动态文件。我的计划是首先查阅我的应用程序中的 MIME 类型列表,然后回退到系统的 MIME 类型列表(但是这有效;显然它存在,因为它是您将文件与程序相关联的方式)。在某些情况下,我只有一个文件扩展名可以使用,但在其他情况下,我可能需要检查一个实际的磁盘文件。由于这些不是用户上传的文件,我相信我可以信任该扩展,并且我更喜欢仅扩展的查找解决方案,因为它看起来更简单、更快。谢谢!

【问题讨论】:

您的假设不正确:在 Windows 上,扩展程序和程序之间的关联不使用 MIME 类型。在注册表中,每个扩展都与一个描述性条目相关联,并且具有\Shell\Open\Command\ 值。这种间接允许两个扩展共享一个描述性条目,例如.jpeg.jpg 共享描述性条目 jpegfile MSalters,我可以发誓,在 XP 中,文件关联对话框中有一个 MIME 类型的位置......但在 Win Server 2k8 上,在“默认程序”对话框中,似乎就像你说的那样……这对我没用:( 【参考方案1】:

HKEY_CLASSES_ROOT\\.<ext>\Content Type(其中“ext”是文件扩展名)通常会保存 MIME 类型。

【讨论】:

【参考方案2】:

在 Windows 10 中,不同的 MIME 类型存储在注册表中:

HKEY_CLASSES_ROOT\MIME\Database\Content Type

每个内容类型都有一个键(例如text/plain)。

【讨论】:

【参考方案3】:

从http://www.snoyman.com/blog/2012/03/ie-mimetype-png.html粘贴:

#include <urlmon.h>
#include <stdio.h>

int main(int argc, char* argv[])

    char buff[256];
    LPWSTR out;

    FILE *in = fopen("title.png", "rb");

    fread(buff, 1, 256, in);

    FindMimeFromData(NULL, NULL, buff, 256, NULL, FMFD_DEFAULT, &out, 0);

    printf("%ls\n", out);

    return 0;

【讨论】:

以上是关于在 Windows 上查找文件的 MIME 类型的主要内容,如果未能解决你的问题,请参考以下文章

『速查手册』MIME 多用途互联网邮件扩展

『速查手册』MIME 多用途互联网邮件扩展

yii2 css 文件不会加载,因为它是 MIME 类型 text/html 在 windows7 apache 服务器上不是 text/css

PHP - 使用正确的 MIME 类型打开上传的 DOCX 文件

如何使用 php 在文件上设置 mime 类型?

如何找到文件“mime-type(Content-Type?)”?在 Windows 上