我需要猜測MIME類型,目的是爲某些文件上傳填充「Content-Type」標題。任何方式來猜測Delphi XE2上的MIME類型?
我未能找到解決方案。
我想打電話給:GetMimeType('C:File.jpg')
,然後取回image/jpg
。
最好是multiplataform(對於win/osx),但如果僅適用於windows,就足夠了。
我需要猜測MIME類型,目的是爲某些文件上傳填充「Content-Type」標題。任何方式來猜測Delphi XE2上的MIME類型?
我未能找到解決方案。
我想打電話給:GetMimeType('C:File.jpg')
,然後取回image/jpg
。
最好是multiplataform(對於win/osx),但如果僅適用於windows,就足夠了。
互聯網直接(印第安納波利斯)包含此一類:
類TIdThreadSafeMimeTable
在單元IdCustomHTTPServer
代碼例如在HTTP服務器應用:
Response.ContentType :=
Response.HTTPServer.MIMETable.GetFileMIMEType(FileName);
你在說什麼文件類型?也許你可以創建一個你想要支持的類型列表。
我能想象這些列表可在互聯網上爲好,例如
只需使用獲取文件擴展名並再次檢查其中的一個列表。一個文件沒有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
的CLSID返回從GetClassFileOrMime
可能位於註冊表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
可能在客戶端被篡改,並且也與服務器上的註冊表不匹配-側。