2012-03-24 40 views
9

我需要猜測MIME類型,目的是爲某些文件上傳填充「Content-Type」標題。任何方式來猜測Delphi XE2上的MIME類型?

我未能找到解決方案。

我想打電話給:GetMimeType('C:File.jpg'),然後取回image/jpg

最好是multiplataform(對於win/osx),但如果僅適用於windows,就足夠了。

回答

5

互聯網直接(印第安納波利斯)包含此一類:

類TIdThreadSafeMimeTable

在單元IdCustomHTTPServer

代碼例如在HTTP服務器應用:

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

你在說什麼文件類型?也許你可以創建一個你想要支持的類型列表。

我能想象這些列表可在互聯網上爲好,例如

只需使用獲取文件擴展名並再次檢查其中的一個列表。一個文件沒有MIME類型,所以你需要使用這個文件擴展名列表,或者通過讀取文件頭來確定文件頭,這更難,也不可靠。

9

嘗試使用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

7

IE使用GetClassFileOrMimeFindMimeFromData 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可能在客戶端被篡改,並且也與服務器上的註冊表不匹配-側。