[BlueLeaf1336]> PROGRAM>

MediaTypeを調べよう

historyTOP

2003/08/07:作成

downloadTOP

20030807iMediaType.zip(1,669bytes):ソース
20030807MediaType.zip(1,019bytes):出力サンプル

memoTOP

WEBサーバはヘッダの一部に Content Type を返さなければならないようです。
で、参考にしている書籍では、対応表を配列にして持っているのですが、そんなんじゃ話にならないぐらいメディアタイプは多いです。

で、レジストリから読み出す関数と検索する(拡張子からメディアタイプ2変換する)関数を作ったのですが、意外に長かったのでなんとなく載せてみます。
ただ、レジストリを読んだのは(TRegistryを使用して)初めてで本当にあってるのかどうか微妙です。 とりあえず何も書き込んでいません。少なくとも Write なんとかなメソッドは読んでません。

※Content Type とメディアタイプと Media Type を使い分けているわけではありません。勢いです。

codeTOP

(*
    #######################################################

    目的    :   拡張子からメディアタイプを取得する
    備考    :   レジストリから読み出す
    履歴    :   2003/08/07 作成

    ------------------------------------------------------
    fjtkt@ybb.ne.jp         http://www.geocities.jp/fjtkt/
    ------------------------------------------------------

    #######################################################
*)

unit iMediaType;

interface

uses
    Windows, SysUtils, Classes, Registry, IniFiles;

type
    TMediaType = class
    private
        TickCount   : Cardinal;
        Finder      : TStringList;
        procedure   CreateDictionary();
    public
        function    GetTickCount(): Cardinal;
        constructor Create();
        destructor  Destroy(); override;
        function    GetMediaType(AExt: string): string;
        procedure   SaveToFile(AFileName: string = 'MediaType.txt'; AForce: Boolean = False);
    end;

implementation

// -----------------------------------------------------------------------------
// コンストラクタ
// -----------------------------------------------------------------------------
constructor TMediaType.Create();
begin
    inherited Create();
    // 検索用リスト作成
    Finder := THashedStringList.Create;
    // 大文字小文字無視
    Finder.CaseSensitive := False;
    // 辞書作成
    CreateDictionary();
    // ソート
    Finder.Sort();
end;

// -----------------------------------------------------------------------------
// デストラクタ
// -----------------------------------------------------------------------------
destructor  TMediaType.Destroy();
begin
    // リスト破棄
    Finder.Free;
    inherited Destroy();
end;

// -----------------------------------------------------------------------------
// 拡張子から MIME TYPE 判定するための辞書作成
// -----------------------------------------------------------------------------
procedure   TMediaType.CreateDictionary();
const
    CONTENT_TYPE_ENTRY = 'Content Type';
var
    Reg: TRegistry;
    Keys: TStrings;
    i: integer;
begin
    // 処理時間計測開始
    TickCount := GetTickCount;

    Reg := TRegistry.Create;
    try
        // レジストリのルートキーセット
        Reg.RootKey := HKEY_CLASSES_ROOT;
        // 作業用リスト作成
        Keys := TStringList.Create;
        try
            // カレントキーセット
            if Reg.OpenKeyReadOnly('\') then
            begin
                // キー名取出し
                Reg.GetKeyNames(Keys);
                // 拡張子でなさそうなものは排除
                for i := Keys.Count - 1 downto 0 do
                begin
                    if Copy(Keys[i], 1, 1) <> '.' then Keys.Delete(i);
                end;
                // Content Type キーを持つ場合に辞書登録
                for i := Keys.Count - 1 downto 0 do
                begin
                    if Reg.OpenKeyReadOnly(Keys[i]) then
                    begin
                        if Reg.ValueExists(CONTENT_TYPE_ENTRY) then
                        begin
                            Finder.Add(Format('%s=%s', [Keys[i], Reg.ReadString(CONTENT_TYPE_ENTRY)]));
                        end;
                        Reg.CloseKey();
                    end;
                end;
            end;
        finally
            Keys.Free;
        end;
    finally
        Reg.Free;
    end;

    // 処理時間計測終了
    TickCount := GetTickCount - TickCount;
end;

// -----------------------------------------------------------------------------
// 辞書検索
// -----------------------------------------------------------------------------
function    TMediaType.GetMediaType(AExt: string): string;
var
    index: integer;
begin
    // 探して
    index := Finder.IndexOfName(AExt);
    if index <> -1 then
    begin
        // あればそれ
        Result := Finder.Values[AExt];
    end else
    begin
        // 無ければとりあえず
        Result := 'application/octet-stream';
    end;
end;

// -----------------------------------------------------------------------------
// ファイル出力
// -----------------------------------------------------------------------------
procedure   TMediaType.SaveToFile(AFileName: string = 'MediaType.txt'; AForce: Boolean = False);
var
    GoSave: Boolean;
begin
    // 行っていいの?
    GoSave := AForce or (not FileExists(AFileName));
    // よしなに
    if GoSave then Finder.SaveToFile(AFileName);
end;

// -----------------------------------------------------------------------------
// かかった時間は?
// -----------------------------------------------------------------------------
function    TMediaType.GetTickCount(): Cardinal;
begin
    Result := TickCount;
end;

end.

sample codeTOP

こんな感じで使います。

uses iMediaType;
        :
with TMediaType.Create do
begin
    ShowMessage(GetMediaType('.txt'));  // 対応表検索
    SaveToFile();                       // 対応表保存(アプリのある場所)
    Free;
end;

EOFTOP