またまた質問です、スイマセン。
指定されたURLのファイルをDL保存したいですW
よろしくおねがいします。
以下にありますよ。
> http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/index.htm
> http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/730_AutoDLDefrose.htm
こちらには、沢山のサンプルがあり勉強になります。
これでしょうか?
DownloadFile
IdHTTP1.Get
でエラーがでます。
//=============================================================================
// インターネット上のファイルをディスクにダウンロード
// [Indy Clients]タブのTIdHTTPコンポーネントを使用する例
//=============================================================================
function TForm1.DownloadFile(SourceFile, DestFile: string): Boolean;
var
FS : TFileStream;
begin
Result:=True;
//上書き保存(なければ新規作成)
FS :=TFileStream.Create(DestFile,fmCreate);
try
try
IdHTTP1.Get(SourceFile,FS);
except
Result:=False;
end;
finally
FS.Free;
end;
end;
>エラーがでます。
もう少し詳細にエラーの内容など書かれたほうが、よろしいかと思います。
赤線が出てしまうんです。
こまった。。。
実行時は以下です。
[Pascal エラー] me.pas(55): E2003 未定義の識別子 : 'DownloadFile'
[Pascal エラー] me.pas(64): E2003 未定義の識別子 : 'IdHTTP1'
VBでは割と簡単にできたんですが、Delphiでは結構ややこしいですぅ。
よろしくお願いします。
コンパイル時のエラーの場合、ソースコードも書いたほうがよろしいか
と思います。
>[Pascal エラー] me.pas(55): E2003 未定義の識別子 : 'DownloadFile'
ですが、
>function TForm1.DownloadFile(SourceFile, DestFile: string): Boolean;
フォームが TMee なら、“TForm1.”の部分は、“TMee.”に置き換える必要はあります。
あと、以下のように、privateのところにでも、追加。
TMee = class(TForm)
・・・・
private
{ Private 宣言 }
・・・・
function DownloadFile(SourceFile, DestFile: string): Boolean; // 追加
・・・・
public
{ Public 宣言 }
・・・・
end;
>[Pascal エラー] me.pas(64): E2003 未定義の識別子 : 'IdHTTP1'
のほうは、
> http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/730_AutoDLDefrose.htm
で、
>[Indy Clients]タブのTIdHTTPコンポーネントを使用することもできます.
と書いているとおり、TIdHTTP をフォームにドロップしてください。
スイマセンいろいろやったんですが、なにがなんだか・・・
そもそも
http://****.com/***このURLを
c:\*** に保存するという単純なものを求めています。
>なにがなんだか・・・
なにがわからないのか、具体的に書かれたほうがよろしいかと思います。
まだ、コンパイル時にエラー表示がでるとか・・・・
> http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/730_AutoDLDefrose.htm
で書かれていることでわからない部分があるとか・・・・
すいません取り乱しました。
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/730_AutoDLDefrose.htm
リスト5に挑戦した結果
[Pascal エラー] me.pas(18): E2065 forward または external 宣言された 'TMee.DownloadFile' が見つかりません
以下ソースです。
usesにHTTPApp
private
{ Private 宣言 }
function DownloadFile(SourceFile, DestFile: string):Boolean;//DL
//=============================================================================
// DownLoadFile関数を用いてネット上の指定画像を保存する例
// 筆者のサイトの[Holbow資料館]の画像を保存
// UnixPathToDosPathにはusesにHTTPAppが必要
//=============================================================================
procedure TMee.Button1Click(Sender: TObject);
var
APath : String;
AFile : String;
begin
APath:='http://homepage2.nifty.com/Mr_XRAY/Halbow/Image/Halbow_Bunner01.gif';
//画像の保存先(このアプリの起動フォルダに保存)
//保存名はHalbow_Bunner01.gif
AFile:=ExtractFilePath(ParamStr(0))+ExtractFileName(UnixPathToDosPath(APath));
DownloadFile(APath,AFile);
end;
ちなみにこのソースで画像以外のファイルでもDL可能でしょうか?
ちょっと適当だけど、以下でどうですか?
unit unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs
,Buttons, StdCtrls, ExtCtrls, ComCtrls
,WinInet ,HTTPApp
;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
DLoad: TButton;
DLurl: TEdit;
Label1: TLabel;
Label2: TLabel;
save_dir: TEdit;
StatusBar1: TStatusBar;
procedure FormShow(Sender: TObject);
procedure DLoadClick(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//---------------------------------------------------------
// WEBからダウンロード関数
function DownloadFileUseWinInet(SourceFile,DestFile:string; obj1:TObject): Boolean;
var
FS : TFileStream;
hSession : HINTERNET;
hService : HINTERNET;
dwBytesRead : DWORD;
lpBuffer : array[0..1024+1] of Char;
begin
Result:= True;
if obj1<>nil then
TStatusPanel(obj1).text := 'Download start !!';
hSession:=InternetOpen('MyAppli', INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
if Assigned(hSession) then begin
hService := InternetOpenUrl(hSession,PChar(SourceFile),nil,0,0,0);
if Assigned( hService ) then begin
//上書き保存(なければ新規作成)
try
FS :=TFileStream.Create(DestFile,fmCreate);
try
dwBytesRead := 1024;
while True do begin
lpBuffer:=#0;
if InternetReadFile(hService,@lpBuffer,1024,dwBytesRead) then begin
//これがないと動作中にFormの移動などが不可となる
//Sleep(0)の0は適当0〜10程度でいいようだ
Application.ProcessMessages;
Sleep(0);
if dwBytesRead=0 then break;
FS.WriteBuffer(lpBuffer,dwBytesRead);
end else begin
Result:=False;
break;
end;
end;
finally
FreeAndNil(FS);
end;
except
Result:=False;
end;
end;
end else begin
Result:=False;
end;
InternetCloseHandle(hService);
if obj1<>nil then begin
if Result=true then begin
TStatusPanel(obj1).text := 'Download successful !!';
end else begin
TStatusPanel(obj1).text := 'Download failed !!';
end;
end;
end;
//--------------------------------------
procedure TForm1.FormShow(Sender: TObject);
begin
DLurl.Text := 'http://www.google.com/';
end;
procedure TForm1.DLoadClick(Sender: TObject);
var
SourceFile, DestFile: string;
obj1:TObject;
begin
SourceFile := DLurl.Text ;
DestFile := save_dir.Text+ExtractFileName(UnixPathToDosPath(SourceFile));
obj1 := StatusBar1.Panels[0];
if (DownloadFileUseWinInet(SourceFile, DestFile,obj1)=false) then begin
showmessage('Download error!! '+DestFile);
end;
end;
end.
通りすがり 様 ありがとうございます。
が、シカシナガラ・・・・
毎回皆様の方法がちがうようで、私もなかなか混乱してまいました。
WEBからファイルをDLするだけでこんなに長いソースになるのですか?
できれば、ソースでURLも指定しているようなものがわかりやすいです。
usesに UrlMon を追加して、以下で出来ると思います。
画像ではないファイルでもOKです。
var
Url, FileName: string;
begin
Url :='http://www.google.co.jp/intl/ja_jp/images/logo.gif';
FileName:='c:\logo.gif';
if UrlDownloadToFile(nil, PChar(Url), PChar(FileName), 0, nil) = S_OK then
begin
// ダウンロードが成功したときの処理
end else
begin
// ダウンロードが失敗したときの処理
end;
end;
感無量最高です。
最高!
ツイート | ![]() |