有什么方法可以猜测Delphi XE2上的mime类型吗?

mam*_*mcx 10 delphi content-type mime-types delphi-xe2

我需要猜测mime类型,目的是为某些文件上传填充"Content-Type"标题.

我没有找到解决方案.

我希望称之为:GetMimeType('C:File.jpg')并且回来image/jpg.

最好的是多平台(对于win/osx),但仅限于windows.

RRU*_*RUZ 9

尝试使用FindMimeFromData函数.

FindMimeFromData包含(当前26个)单独MIME类型的硬编码测试(请参阅已知的MIME类型).这意味着如果给定的缓冲区包含其中一种MIME类型的数据,则FindMimeFromData中存在一个测试(通过扫描缓冲区内容)以识别相应的MIME类型.

来自urlmon.pas

function FindMimeFromData(
    pBC: IBindCtx;                      // bind context - can be nil
    pwzUrl: LPCWSTR;                    // url - can be nil
    pBuffer: Pointer;                   // buffer with data to sniff - can be nil (pwzUrl must be valid)
    cbSize: DWORD;                      // size of buffer
    pwzMimeProposed: LPCWSTR;           // proposed mime if - can be nil
    dwMimeFlags: DWORD;                 // will be defined
    out ppwzMimeOut: LPWSTR;            // the suggested mime
    dwReserved: DWORD                   // must be 0
  ): HResult; stdcall;
Run Code Online (Sandbox Code Playgroud)

另外这篇文章看热点有用 MIME Type Detection in Internet Explorer


kob*_*bik 7

IE使用GetClassFileOrMimeFindMimeFromDataAPI来检测mime类型的数据/文件(UrlMonDelphi中的单元).

Internet Explorer中的MIME类型检测

返回的CLSID GetClassFileOrMime可以位于注册表下HKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes.(也FileExtensions,FriendlyName).

注册表还包含一个MIME数据库:HKEY_CLASSES_ROOT\MIME\Database\Content Type.

但是由于已知MIME类型的列表相对较小,您可以将其作为资源XML(或其他任何东西)保存,并简单地从那里获取它.这将支持Windows和OSX.


对于文件上传操作,您可以随时使用application/octet-stream.
Indy有TIdMimeTableclass(IdGlobal),它使用固定列表加上检查注册表HKEY_CLASSES_ROOT(参见参考资料FillMimeTable).如果未找到匹配项,application/octet-stream则使用.
您可能希望在上载文件后检查服务器端的文件内容,而不是依赖于标头,因为它ContentType可能在客户端被篡改,也与服务器端的注册表不匹配.


mjn*_*mjn 6

Internet Direct(Indy)包含一个类:

class TIdThreadSafeMimeTable

在IdCustomHTTPServer单元中

HTTP服务器应用程序中的代码示例:

Response.ContentType :=
  Response.HTTPServer.MIMETable.GetFileMIMEType(FileName);
Run Code Online (Sandbox Code Playgroud)


Gol*_*rol 5

你在谈论几种文件类型?也许你可以创建一个你想要支持的类型列表.

我可以想象这些列表也可以在互联网上获得,例如

只需使用文件扩展名,ExtractFileExt然后再检查其中一个列表.文件中没有mime类型,因此您需要使用此文件扩展名列表,或者通过读取文件头来确定类型,这样更难并且不可靠.