【问题标题】:Any way to guess the mime type on Delphi XE2?有什么方法可以猜测 Delphi XE2 上的 mime 类型吗?
【发布时间】:2012-04-09 00:29:19
【问题描述】:

我需要猜测 mime 类型,以便为某些文件上传填充“Content-Type”标头。

我没有找到解决办法。

我希望拨打类似的电话:GetMimeType('C:File.jpg') 并回复image/jpg

最好是多平台(对于win/osx),但如果只适用于windows就足够了。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      尝试使用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;
      

      还有这篇文章看热就行了MIME Type Detection in Internet Explorer

      【讨论】:

        【解决方案3】:

        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
        文件上传后,您可能希望在服务器端检查文件 content ,而不是依赖标头,因为 ContentType 可能在客户端被篡改,也不匹配服务器端的注册表。

        【讨论】:

          【解决方案4】:

          Internet Direct (Indy) 包含一个用于此的类:

          类 TIdThreadSafeMimeTable

          以 IdCustomHTTPServer 为单位

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

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

          【讨论】:

            猜你喜欢
            • 2016-06-19
            • 1970-01-01
            • 2013-01-16
            • 1970-01-01
            • 2011-12-04
            • 2021-01-08
            • 2021-07-18
            • 2016-07-22
            相关资源
            最近更新 更多