我需要猜测mime类型,目的是为某些文件上传填充“Content-Type”标题。
我找不到解决方案。
我想打电话给GetMimeType('C:File.jpg')
,然后回复image/jpg
。
最佳,如果是多平台(对于win / osx),但仅仅对于Windows就足够了。
答案 0 :(得分:9)
尝试使用FindMimeFromData功能。
来自urlmon.pas的FindMimeFromData包含(目前为26个)单独的硬编码测试 MIME类型(请参阅Known MIME Types)。这意味着如果给定缓冲区 包含这些MIME类型之一格式的数据,存在测试 在设计的FindMimeFromData中(通过扫描缓冲区 内容)识别相应的MIME类型。
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使用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
您可能希望在上传文件后检查服务器端的文件内容,而不是依赖于标头,因为ContentType
可能会在客户端被篡改,也不会与服务器端的注册表匹配。
答案 2 :(得分:6)
Internet Direct(Indy)包含一个类:
class TIdThreadSafeMimeTable
单位IdCustomHTTPServer
HTTP服务器应用程序中的代码示例:
Response.ContentType :=
Response.HTTPServer.MIMETable.GetFileMIMEType(FileName);
答案 3 :(得分:5)
您在谈论多少种文件?也许你可以创建一个你想要支持的类型列表。
我可以想象这些列表也可以在互联网上找到,例如
只需使用ExtractFileExt
获取文件扩展名,然后再检查其中一个列表。文件中没有mime类型,因此您需要使用此文件扩展名列表,或者通过读取文件头来确定类型,这样更难,也是不可靠的。