| 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 |