mam*_*mcx 10 delphi content-type mime-types delphi-xe2
我需要猜测mime类型,目的是为某些文件上传填充"Content-Type"标题.
我没有找到解决方案.
我希望称之为:GetMimeType('C:File.jpg')并且回来image/jpg.
最好的是多平台(对于win/osx),但仅限于windows.
尝试使用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
IE使用GetClassFileOrMime和FindMimeFromDataAPI来检测mime类型的数据/文件(UrlMonDelphi中的单元).
返回的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可能在客户端被篡改,也与服务器端的注册表不匹配.
Internet Direct(Indy)包含一个类:
class TIdThreadSafeMimeTable
在IdCustomHTTPServer单元中
HTTP服务器应用程序中的代码示例:
Response.ContentType :=
Response.HTTPServer.MIMETable.GetFileMIMEType(FileName);
Run Code Online (Sandbox Code Playgroud)
你在谈论几种文件类型?也许你可以创建一个你想要支持的类型列表.
我可以想象这些列表也可以在互联网上获得,例如
只需使用文件扩展名,ExtractFileExt然后再检查其中一个列表.文件中没有mime类型,因此您需要使用此文件扩展名列表,或者通过读取文件头来确定类型,这样更难并且不可靠.