有没有内置的方法可以在Delphi(XE7)中获取给定MIME类型的标准扩展名?
我正在寻找最简单和最通用的实现方式,以实现像这样调用的函数:
我正在寻找最简单和最通用的实现方式,以实现像这样调用的函数:
fileExt := GetExtension('text/xml');
fileExt := GetExtension('text/xml');
看起来Indy已经有一个内置的函数可以处理这个问题,它在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服务器。
TIdThreadSafeMimeTable
旨在与 TIdHTTPServer
一起使用,因为它是一个多线程服务器,其工作线程经常需要访问缓存的 MIME 信息。在 IdGlobalProtocols
单元中有一个非线程安全的 TIdMimeTable
,它还具有独立的 GetMIMETypeFromFile()
和 GetMIMEDefaultFileExt()
函数(它们在内部使用 TIdMimeTable
)。在上面的示例中,由于每次调用时都会创建和销毁表格,因此使用 TIdThreadSafeMimeTable
是过度的,只需使用 TIdMimeTable
或甚至 GetMIMEDefaultFileExt()
即可。 - Remy LebeauIndy的IndyProtocols
包中有一个TIdMimeTable
类和独立的GetMIMETypeFromFile()
和GetMIMEDefaultFileExt()
包装函数,它们位于IdGlobalProtocols
单元中。
uses
..., IdGlobalProtocols;
function GetExtension(const AMIMEType: string);
begin
Result := GetMIMEDefaultFileExt(AMIMEType);
end
GetMIMEDefaultFileExt()
内部创建并销毁了一个TIdMimeTable
对象,该对象每次创建时都会重新构建已知扩展名和MIME类型的列表。如果您经常查询MIME扩展名,则值得创建自己的TIdMimeTable
对象(或TIdThreadSafeMimeTable
如果需要在多个线程之间共享表格)并在每次重复使用它: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;
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;
HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/html 的 Extension 值。
对于更高版本的Delphi,您可以使用System.Net.Mime
单元中的TMimeTypes
类。
有两种方法可以用来填充内部字典以执行查找。第一个AddDefTypes
将添加标准类型,方法AddOSTypes
将添加主机操作系统定义的任何类型(对于Windows,它会进行注册表扫描)。如果调用TMimeTypes.GetDefault
,它将在首次调用时使用这两种方法构造一个TMimeTypes
实例(单例)。