是否有内置方法在Delphi(XE7)中获取给定MIME类型的标准扩展?
我正在寻找最简单,最通用的方法来实现一个像这样调用的函数:
fileExt := GetExtension('text/xml');
答案 0 :(得分:4)
在 TIdThreadSafeMimeTable 上,Indy似乎有内置功能:
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 :(得分:4)
Indy的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;
答案 2 :(得分:3)
HKEY_CLASSES_ROOT \ MIME \ Database \ Content Type \ text / html,value Extension。
答案 3 :(得分:0)
对于最新版本的Delphi,可以在单位TMimeTypes
中使用System.Net.Mime
类
您可以使用两种方法为内部字典设定种子以执行查找。第一个AddDefTypes
将添加标准类型,方法AddOSTypes
将添加由主机OS定义的任何类型(对于Windows,它将进行注册表爬网)。如果您调用TMimeTypes.GetDefault
,它将在首次调用(单例)时使用这两种方法构造一个TMimeTypes实例。