私はウェブサイトのURLを持っています。次のようになります: http://www.example.com/downloads/file/4789/download ?
ファイルをシステムに保存したいのですが、この例の URL によってトリガーされたダウンロードのファイル名を取得する方法がわかりません。一部のファイルは pdf で、他は doc や rtf などです。
誰かがファイル名の問題と使用するコンポーネントの方向性を教えていただければ、本当に感謝しています。
私はウェブサイトのURLを持っています。次のようになります: http://www.example.com/downloads/file/4789/download ?
ファイルをシステムに保存したいのですが、この例の URL によってトリガーされたダウンロードのファイル名を取得する方法がわかりません。一部のファイルは pdf で、他は doc や rtf などです。
誰かがファイル名の問題と使用するコンポーネントの方向性を教えていただければ、本当に感謝しています。
URL からファイル名を取得するには、HEAD 情報を取得してContent Dispositionヘッダー フィールドを確認します。このタスクでは、TIdHTTP indy コンポーネントを使用できます。Content Disposition にファイル名がない場合は、URL の解析を試すことができます。
このサンプルを試してください。
{$APPTYPE CONSOLE}
{$R *.res}
uses
IdURI,
IdHttp,
SysUtils;
function GetRemoteFileName (const URI: string) : string;
var
LHttp: TIdHTTP;
begin
LHttp := TIdHTTP.Create(nil);
try
LHttp.Head(URI);
Result:= LHTTP.Response.RawHeaders.Params['Content-Disposition', 'filename'];
if Result = '' then
with TIdURI.Create(URI) do
try
Result := Document;
finally
Free;
end;
finally
LHttp.Free;
end;
end;
begin
try
Writeln(GetRemoteFileName('http://dl.dropbox.com/u/12733424/Blog/Delphi%20Wmi%20Code%20Creator/Setup_WmiDelphiCodeCreator.exe'));
Writeln(GetRemoteFileName('http://studiostyl.es/settings/downloadScheme/1305'));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.