【发布时间】: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
我需要猜测 mime 类型,以便为某些文件上传填充“Content-Type”标头。
我没有找到解决办法。
我希望拨打类似的电话:GetMimeType('C:File.jpg') 并回复image/jpg。
最好是多平台(对于win/osx),但如果只适用于windows就足够了。
【问题讨论】:
标签: delphi mime-types content-type delphi-xe2
您在谈论多少种文件类型?也许您可以创建一个您想要支持的类型列表。
我可以想象这些列表也可以在互联网上找到,例如
只需使用ExtractFileExt 获取文件扩展名,然后再次检查其中一个列表。文件中没有 mime 类型,因此您需要使用此文件扩展名列表,或者通过读取文件头来确定类型,这更难且同样不可靠。
【讨论】:
尝试使用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
【讨论】:
IE 使用GetClassFileOrMime 和FindMimeFromData API 来检测数据/文件的mime 类型(Delphi 中的UrlMon 单元)。
MIME Type Detection in Internet Explorer
从GetClassFileOrMime 返回的 CLSID 可能位于HKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes 下的注册表中。 (还有FileExtensions、FriendlyName)。
注册表还拥有一个 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 可能在客户端被篡改,也不匹配服务器端的注册表。
【讨论】:
Internet Direct (Indy) 包含一个用于此的类:
类 TIdThreadSafeMimeTable
以 IdCustomHTTPServer 为单位
HTTP 服务器应用程序中的代码示例:
Response.ContentType :=
Response.HTTPServer.MIMETable.GetFileMIMEType(FileName);
【讨论】: