指定されたURLのファイルをDL保存

解決


ぺんね。  2008-07-31 07:16:25  No: 31424

またまた質問です、スイマセン。
指定されたURLのファイルをDL保存したいですW

よろしくおねがいします。


こちらから  2008-07-31 07:46:23  No: 31425

以下にありますよ。

http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/index.htm
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/730_AutoDLDefrose.htm

こちらには、沢山のサンプルがあり勉強になります。


ぺんね。  2008-07-31 08:05:55  No: 31426

これでしょうか?

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;


igy  2008-07-31 08:14:42  No: 31427

>エラーがでます。

もう少し詳細にエラーの内容など書かれたほうが、よろしいかと思います。


ぺんね。  2008-07-31 08:23:54  No: 31428

赤線が出てしまうんです。

こまった。。。

実行時は以下です。
[Pascal エラー] me.pas(55): E2003 未定義の識別子 : 'DownloadFile'
[Pascal エラー] me.pas(64): E2003 未定義の識別子 : 'IdHTTP1'

VBでは割と簡単にできたんですが、Delphiでは結構ややこしいですぅ。
よろしくお願いします。


igy  2008-07-31 09:18:42  No: 31429

コンパイル時のエラーの場合、ソースコードも書いたほうがよろしいか
と思います。

>[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 をフォームにドロップしてください。


ぺんね。  2008-07-31 09:37:40  No: 31430

スイマセンいろいろやったんですが、なにがなんだか・・・

そもそも
http://****.com/***このURLを

c:\*** に保存するという単純なものを求めています。


igy  2008-07-31 09:46:57  No: 31431

>なにがなんだか・・・

なにがわからないのか、具体的に書かれたほうがよろしいかと思います。

まだ、コンパイル時にエラー表示がでるとか・・・・

http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/730_AutoDLDefrose.htm

で書かれていることでわからない部分があるとか・・・・


ぺんね。  2008-07-31 10:04:38  No: 31432

すいません取り乱しました。

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可能でしょうか?


通りすがり  2008-07-31 10:55:18  No: 31433

ちょっと適当だけど、以下でどうですか?

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.


ぺんね。  2008-07-31 12:05:43  No: 31434

通りすがり 様  ありがとうございます。

が、シカシナガラ・・・・

毎回皆様の方法がちがうようで、私もなかなか混乱してまいました。
WEBからファイルをDLするだけでこんなに長いソースになるのですか?

できれば、ソースでURLも指定しているようなものがわかりやすいです。


眠くなかったのでサンプル書いてみた  2008-07-31 12:22:58  No: 31435

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;


ぺんね。  2008-07-31 12:42:57  No: 31436

感無量最高です。

最高!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加