如何在 Delphi 中获得给定 MIME 类型的标准文件扩展名?
How do I get the standard file extension given a MIME type in Delphi?
在 Delphi (XE7) 中是否有内置方法来获取给定 MIME 类型的标准扩展?
我正在寻找最简单和最通用的方法来实现这样调用的函数:
fileExt := GetExtension('text/xml');
HKEY_CLASSES_ROOT\MIME\Database\Content类型\text/html,值扩展。
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;
编辑: 功能已修复,无需自定义 http 服务器即可直接使用 TIdThreadSafeMimeTable。
Indy 的 IndyProtocols
包在 IdGlobalProtocols
单元中有一个 TIdMimeTable
class 和独立的 GetMIMETypeFromFile()
和 GetMIMEDefaultFileExt()
包装函数,例如:
uses
..., IdGlobalProtocols;
function GetExtension(const AMIMEType: string);
begin
Result := GetMIMEDefaultFileExt(AMIMEType);
end
只知道在内部,GetMIMEDefaultFileExt()
创建和销毁一个 TIdMimeTable
对象,并且该对象每次创建时都会重新构建其已知扩展名和 MIME 类型的列表。如果您要经常查询 MIME 扩展,则值得创建您自己的 TIdMimeTable
对象(或者 TIdThreadSafeMimeTable
,如果您需要在多个线程之间共享 table)并在每个线程中重用它时间:
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;
对于Delphi的更多当前版本,您可以在System.Net.Mime
单元中使用TMimeTypes
class
您可以使用两种方法为内部字典设置种子以执行查找。第一个 AddDefTypes
将添加标准类型,方法 AddOSTypes
将添加主机 OS 定义的任何类型(对于 windows,它会进行注册表抓取)。如果你调用 TMimeTypes.GetDefault
它将在第一次调用时使用这两种方法构造一个 TMimeTypes 实例(单例)。
在 Delphi (XE7) 中是否有内置方法来获取给定 MIME 类型的标准扩展?
我正在寻找最简单和最通用的方法来实现这样调用的函数:
fileExt := GetExtension('text/xml');
HKEY_CLASSES_ROOT\MIME\Database\Content类型\text/html,值扩展。
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;
编辑: 功能已修复,无需自定义 http 服务器即可直接使用 TIdThreadSafeMimeTable。
Indy 的 IndyProtocols
包在 IdGlobalProtocols
单元中有一个 TIdMimeTable
class 和独立的 GetMIMETypeFromFile()
和 GetMIMEDefaultFileExt()
包装函数,例如:
uses
..., IdGlobalProtocols;
function GetExtension(const AMIMEType: string);
begin
Result := GetMIMEDefaultFileExt(AMIMEType);
end
只知道在内部,GetMIMEDefaultFileExt()
创建和销毁一个 TIdMimeTable
对象,并且该对象每次创建时都会重新构建其已知扩展名和 MIME 类型的列表。如果您要经常查询 MIME 扩展,则值得创建您自己的 TIdMimeTable
对象(或者 TIdThreadSafeMimeTable
,如果您需要在多个线程之间共享 table)并在每个线程中重用它时间:
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;
对于Delphi的更多当前版本,您可以在System.Net.Mime
TMimeTypes
class
您可以使用两种方法为内部字典设置种子以执行查找。第一个 AddDefTypes
将添加标准类型,方法 AddOSTypes
将添加主机 OS 定义的任何类型(对于 windows,它会进行注册表抓取)。如果你调用 TMimeTypes.GetDefault
它将在第一次调用时使用这两种方法构造一个 TMimeTypes 实例(单例)。