Hel*_*t D 4 delphi file-extension mime-types delphi-xe7
在 Delphi (XE7) 中,是否有一种内置方法可以获取给定 MIME 类型的标准扩展名?
我正在寻找最简单和最通用的方法来实现一个可以这样调用的函数:
fileExt := GetExtension('text/xml');
Run Code Online (Sandbox Code Playgroud)
似乎 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;
Run Code Online (Sandbox Code Playgroud)
编辑:功能固定为直接使用 TIdThreadSafeMimeTable,无需自定义 http 服务器。
Indy 的IndyProtocols包在单元中有一个TIdMimeTable类和独立GetMIMETypeFromFile()和GetMIMEDefaultFileExt()包装函数IdGlobalProtocols,例如:
uses
..., IdGlobalProtocols;
function GetExtension(const AMIMEType: string);
begin
Result := GetMIMEDefaultFileExt(AMIMEType);
end
Run Code Online (Sandbox Code Playgroud)
只要知道在内部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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)