2017-07-06 72 views
3

在Delphi(XE7)中是否有一種內置方式可以獲得給定MIME類型的標準擴展?如何在Delphi中獲得MIME類型的標準文件擴展名?

我在尋找實施,將這樣調用函數的最簡單和最常用的方法:

fileExt := GetExtension('text/xml'); 
+0

不是我所知道的,而是一個快速谷歌發現這個:https://www.thoughtco.com/file-extensions-and-mime-types-3469109 –

+0

謝謝你的鏈接,但我希望有一個系統函數,因爲MIME類型的集合隨着時間而改變。例如,在您鏈接的表中,docx(application/vnd.openxmlformats-officedocument.wordprocessingml.document)沒有條目。 –

回答

3

HKEY_CLASSES_ROOT \ MIME \數據庫\內容類型\ text/html的,價值延伸。

+0

謝謝,就是這樣! –

+0

當然有一個API或一些標準的封裝方法。沒有文檔說這是穩定的,它看起來像脆弱的註冊表黑客攻擊。 –

+0

@DavidHeffernan Indy也使用這個註冊表鍵,所以我們可以認爲這是「官方」的方式。 –

4

似乎印有一個內置的功能是,在TIdThreadSafeMimeTable

Uses 
    IdCustomHTTPServer; 


function GetMIMETypeDefaultExtension(const aMIMEType: String): String; 
var 
    mimetable: TIdThreadSafeMimeTable; 
Begin 
    if not(aMIMEType.Trim.IsEmpty) then 
    Begin 
    mimetable := TIdThreadSafeMimeTable.Create(true); 
    try 
     result := mimetable.GetDefaultFileExt(aMIMEType); 
    finally 
     mimetable.Free; 
    end 
    End 
    else 
     result := ''; 
End; 

編輯:功能固定直接使用TIdThreadSafeMimeTable沒有自定義HTTP服務器。

+1

您也可以直接在同一單元中使用* TIdThreadSafeMimeTable *(無需創建服務器) – mjn42

+0

將anser更改爲使用該類,如您所建議的那樣。 –

+1

'TIdThreadSafeMimeTable'旨在與'TIdHTTPServer'一起使用,因爲它是一個多線程服務器,其工作線程經常需要訪問緩存的MIME信息。在IdGlobalProtocols中有一個非線程安全的TIdMimeTable,它也有獨立的GetMIMETypeFromFile()和GetMIMEDefaultFileExt()函數(它們在內部使用TIdMimeTable)。在上面的示例中,由於每次調用時都會創建和銷燬表,所以使用'TIdThreadSafeMimeTable'會有些過度,只需使用'TIdMimeTable'或者甚至是'GetMIMEDefaultFileExt()'。 –

4

Indy的IndyProtocols封裝具有TIdMimeTable類和獨立GetMIMETypeFromFile()GetMIMEDefaultFileExt()包裝函數在IdGlobalProtocols單位,例如:

uses 
    ..., IdGlobalProtocols; 

function GetExtension(const AMIMEType: string); 
begin 
    Result := GetMIMEDefaultFileExt(AMIMEType); 
end 

只知道在內部,GetMIMEDefaultFileExt()創建和銷燬TIdMimeTable對象,該對象再每次創建時都會生成已知擴展名和MIME類型的列表。

uses 
    ..., IdGlobalProtocols; 

var 
    MimeTable: TIdMimeTable = nil; 

function GetExtension(const AMIMEType: string); 
begin 
    if MimeTable = nil then 
    MimeTable := TIdMimeTable.Create; 
    Result := MimeTable.GetDefaultFileExt(AMIMEType); 
end; 

initialization 
finalization 
    MimeTable.Free; 

:如果你要經常查詢MIME擴展,(如果你需要共享在多個線程表或 TIdThreadSafeMimeTable),每次重複使用它這將是值得創建自己的 TIdMimeTable對象
uses 
    ..., IdGlobalProtocols, IdCustomHTTPServer; 

var 
    MimeTable: TIdThreadSafeMimeTable = nil; 

function GetExtension(const AMIMEType: string); 
begin 
    if MimeTable = nil then 
    MimeTable := TIdThreadSafeMimeTable.Create; 
    Result := MimeTable.GetDefaultFileExt(AMIMEType); 
end; 

initialization 
finalization 
    MimeTable.Free; 
相關問題