2017-07-06 154 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; 
相关问题