在 Delphi 中,如何获得给定 MIME 类型的标准文件扩展名?

Hel*_*t D 4 delphi file-extension mime-types delphi-xe7

在 Delphi (XE7) 中,是否有一种内置方法可以获取给定 MIME 类型的标准扩展名?

我正在寻找最简单和最通用的方法来实现一个可以这样调用的函数:

fileExt := GetExtension('text/xml');
Run Code Online (Sandbox Code Playgroud)

Tun*_*ğlu 5

似乎 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 服务器。

  • `TIdThreadSafeMimeTable` 旨在与 `TIdHTTPServer` 一起使用,因为它是一个多线程服务器,其工作线程经常需要访问缓存的 MIME 信息。在`IdGlobalProtocols` 单元中有一个非线程安全的`TIdMimeTable`,它也有独立的`GetMIMETypeFromFile()` 和`GetMIMEDefaultFileExt()` 函数(内部使用`TIdMimeTable`)。在上面的例子中,由于它每次调用时都会创建和销毁表,使用`TIdThreadSafeMimeTable` 是矫枉过正,只需使用`TIdMimeTable` 甚至`GetMIMEDefaultFileExt()` 代替。 (2认同)

Rem*_*eau 5

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)