Delphi(XE7)で特定のMIMEタイプの標準拡張を取得する組み込みの方法はありますか?Delphiで標準のファイル拡張子をMIMEタイプで取得するにはどうすればよいですか?
私はこのように呼ばれることになる機能を実装するための最も簡単で一般的な方法を探しています:
fileExt := GetExtension('text/xml');
Delphi(XE7)で特定のMIMEタイプの標準拡張を取得する組み込みの方法はありますか?Delphiで標準のファイル拡張子をMIMEタイプで取得するにはどうすればよいですか?
私はこのように呼ばれることになる機能を実装するための最も簡単で一般的な方法を探しています:
fileExt := GetExtension('text/xml');
HKEY_CLASSES_ROOT \ MIME \データベース\コンテンツタイプの\ text/htmlで、値の拡張を。
ありがとうございました! –
確かに、これをカプセル化するAPIや標準的な方法があります。これは安定していると書かれていなければ、壊れやすいレジストリハッキングのように見えます。 –
@DavidHeffernan 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を使用するように固定機能。
uses
..., IdGlobalProtocols;
function GetExtension(const AMIMEType: string);
begin
Result := GetMIMEDefaultFileExt(AMIMEType);
end
ちょうど内部で、GetMIMEDefaultFileExt()
は、作成しTIdMimeTable
オブジェクトを破壊することを知っていると、そのオブジェクトの再:
* TIdThreadSafeMimeTable *を同じユニットで直接使用することもできます(サーバーを作成する必要はありません)。 – mjn42
は、あなたが提案したようにanserがそのクラスを使用するように変更しました。 –
'TIdThreadSafeMimeTable'はワーカースレッドが頻繁にキャッシュされたMIME情報へのアクセスを必要とするマルチスレッドサーバであるため、TIdHTTPServerとともに使用することを意図しています。 'IdGlobalProtocols'ユニットにスレッドセーフではない' TIdMimeTable'があります。これにはスタンドアロンの 'GetMIMETypeFromFile()'と 'GetMIMEDefaultFileExt()'関数(内部で 'TIdMimeTable'を使います)があります。上記の例では、呼び出されるたびにテーブルを作成および破棄しているため、 'TIdThreadSafeMimeTable'を使用することは過剰です。代わりに' TIdMimeTable'または 'GetMIMEDefaultFileExt()'を使用してください。 –
インディのIndyProtocols
パッケージはTIdMimeTable
クラスとスタンドアロンGetMIMETypeFromFile()
とGetMIMEDefaultFileExt()
ラッパー関数IdGlobalProtocols
単位で、例えばを持っています作成されるたびに既知の拡張子とMIMEタイプのリストが作成されます。
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;
:あなたが頻繁にMIME拡張を照会しようとしている場合は、そのたびに再利用(あなたが複数のスレッド間でテーブルを共有する必要がある場合や
TIdThreadSafeMimeTable
)、それはあなた自身の
TIdMimeTable
オブジェクトを作成する価値があるだろう
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;
私は知っているわけではありませんが、すばらしいgoogleがこれを見つけます:https://www.thoughtco.com/file-extensions-and-mime-types-3469109 –
ありがとうございましたが、私はシステムを望んでいましたMIMEタイプのセットが時間とともに変化するため、たとえば、リンクしたテーブルでは、docx(application/vnd.openxmlformats-officedocument.wordprocessingml.document)のエントリはありません。 –