history | TOP |
2003/08/07:作成
download | TOP |
20030807iMediaType.zip(1,669bytes):ソース
20030807MediaType.zip(1,019bytes):出力サンプル
memo | TOP |
WEBサーバはヘッダの一部に Content Type を返さなければならないようです。
で、参考にしている書籍では、対応表を配列にして持っているのですが、そんなんじゃ話にならないぐらいメディアタイプは多いです。
で、レジストリから読み出す関数と検索する(拡張子からメディアタイプ2変換する)関数を作ったのですが、意外に長かったのでなんとなく載せてみます。
ただ、レジストリを読んだのは(TRegistryを使用して)初めてで本当にあってるのかどうか微妙です。
とりあえず何も書き込んでいません。少なくとも Write なんとかなメソッドは読んでません。
※Content Type とメディアタイプと Media Type を使い分けているわけではありません。勢いです。
code | TOP |
(* ####################################################### 目的 : 拡張子からメディアタイプを取得する 備考 : レジストリから読み出す 履歴 : 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 code | TOP |
こんな感じで使います。
uses iMediaType; : with TMediaType.Create do begin ShowMessage(GetMediaType('.txt')); // 対応表検索 SaveToFile(); // 対応表保存(アプリのある場所) Free; end;
EOF | TOP |