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

时间:2012-03-24 22:37:17

标签: delphi mime-types content-type delphi-xe2

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

我找不到解决方案。

我想打电话给GetMimeType('C:File.jpg'),然后回复image/jpg

最佳,如果是多平台(对于win / osx),但仅仅对于Windows就足够了。

4 个答案:

答案 0 :(得分:9)

尝试使用FindMimeFromData功能。

  

FindMimeFromData包含(目前为26个)单独的硬编码测试   MIME类型(请参阅Known MIME Types)。这意味着如果给定缓冲区   包含这些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;

另外,这篇文章看起来很热[{3}}

答案 1 :(得分:7)

IE使用GetClassFileOrMimeFindMimeFromData API来检测mime类型的数据/文件(Delphi中的UrlMon单元)。

MIME Type Detection in Internet Explorer

GetClassFileOrMime返回的CLSID可以位于HKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes下的注册表中。 (还FileExtensionsFriendlyName)。

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

但是由于known MIME types的列表相对较小,你可以把它作为资源XML(或其他),并从那里简单地获取它。这将支持Windows和OSX。


对于文件上传操作,您只需使用application/octet-stream即可 Indy有TIdMimeTable类(IdGlobal),它使用固定列表并检查注册表HKEY_CLASSES_ROOT(请参阅FillMimeTable)。如果未找到匹配项,则使用application/octet-stream 您可能希望在上传文件后检查服务器端的文件内容,而不是依赖于标头,因为ContentType可能会在客户端被篡改,也不会与服务器端的注册表匹配。

答案 2 :(得分:6)

Internet Direct(Indy)包含一个类:

class TIdThreadSafeMimeTable

单位IdCustomHTTPServer

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

Response.ContentType :=
  Response.HTTPServer.MIMETable.GetFileMIMEType(FileName);

答案 3 :(得分:5)

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

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

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