ネットからファイル(GIFやHTML等)を取得したいのですが

解決


マツ  2004-12-02 08:59:55  No: 12004  IP: 192.*.*.*

はじめまして。
過去ログを検索しても見つける事が出来なかったので投稿させて頂きます。

ネットからファイル(GIFやHTML等)を取得したいのですが
どのコンポーネントを使うのが一番簡単でしょうか?

単純にWEBサーバー上のファイルをローカルに落としたいだけなのですが…。

環境は Delphi6 Professinal です。

よろしくお願いします。

編集 削除
ふじっこ  2004-12-02 15:05:20  No: 12005  IP: 192.*.*.*

単純にファイルをダウンロードしてくるだけなら
InternetOpen、InternetOpenUrl、InternetReadFile関数つかって
実現できそうですが
htmlファイルの内容をみてGIF画像やら他ファイルをダウンロード
するには、もうひと工夫いりそうですね

InternetReadFileでファイルダウンロードして
ローカルドライブに保管するときは、TFileStreamで保存したほうがよさそうです。

編集 削除
TtPIPICH  2004-12-02 16:18:21  No: 12006  IP: 192.*.*.*

>どのコンポーネントを使うのが一番簡単でしょうか?
ということなら Indy があります。

編集 削除
ふじっこ  2004-12-03 01:04:58  No: 12007  IP: 192.*.*.*

>どのコンポーネントを使うのが一番簡単でしょうか?
おっと、失礼しました。
私の発言は、参考までにしておいてください^^;

編集 削除
マツ  2004-12-03 08:18:00  No: 12008  IP: 192.*.*.*

ふじっこさん、TtPIPICHさん、
早速のご返信、ありがとうございます!

とりあえず、目的達成の為にInternetReadFile関数を使用することにしました。

Indyはこれから(今から)勉強します。

どうもありがとうございました!!!

編集 削除
りおりお  2004-12-03 10:07:36  No: 12009  IP: 192.*.*.*

ファイル決めうちDLなら URLMon ユニットに簡単に使える関数があるよ。

http://www.campus.ne.jp/~ishigami/CREATION/TECHNIC/WEBAP-2.htm
http://lupin.client.jp/delphi/#44

とか。ググルといっぱい例がある。

編集 削除
マツ  2004-12-03 15:49:17  No: 12010  IP: 192.*.*.*

りおりおさん、ありがとうございます。

早速教えて頂いたホームページに行ってみます!

編集 削除
Fusa  2004-12-03 21:58:15  No: 12011  IP: 192.*.*.*

てっきり、こうやるものだと思っていたけど
いろいろ方法があるんですね。

var
  SaveFileName, SaveURL: String;
  DownLoadURL1: TDownLoadURL;
begin


  DownLoadURL1 := TDownLoadURL.Create(Self); try
  DownLoadURL1.URL := SaveURL;
  DownLoadURL1.Filename := SaveFileName;
  DownLoadURL1.ExecuteTarget(nil);
  finally DownLoadURL1.Free; end;
end;

ふじっこさんの
> 単純にファイルをダウンロードしてくるだけなら
> InternetOpen、InternetOpenUrl、InternetReadFile関数つかって
> 実現できそうですが
というのは、どうやって実装するのでしょうか?

編集 削除
りおりお  2004-12-03 22:45:57  No: 12012  IP: 192.*.*.*

TDownLoadURL ってクラスがあるんですか?

編集 削除
りおりお  2004-12-03 22:55:20  No: 12013  IP: 192.*.*.*

> InternetOpen、InternetOpenUrl、InternetReadFile関数つかって

WinInet.pas にあるやつ。普段はわたしもこれを使っています。

function GetUrlFile(const URL:string; Stream:TStream):Boolean;
var
  hOpen,hURL:HINTERNET;
  pBuf:pointer;
  ReadBytes:DWORD;
begin
  result := false;

  hOpen := InternetOpen('Arara-Agent',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  if not Assigned(hOpen) then exit;

  hURL := InternetOpenURL(hOpen,PChar(URL),nil,0,0,0);
  if not Assigned(hURL) then begin
    InternetCloseHandle(hOpen);
    exit;
  end;

  GetMem(pBuf,1024);
  Stream.Position := 0;
  try
    repeat
      InternetReadFile(hURL,pBuf,1024,ReadBytes);
      Stream.Write(pBuf^,ReadBytes);
    until ReadBytes = 0;
  finally
    FreeMem(pBuf);
    InternetCloseHandle(hURL);
    InternetCloseHandle(hOpen);
  end;
  
  if Stream.Size = 0 then exit;
  Stream.Position := 0;
  result := true;
end;

普通は TMemoryStream で受け取っています。画像なら TBitmap や TJpegImage
TGifImage の LoadFromStream() でセット出来ますし、HTML ドキュメントなら
TWebBrowser に直接セットしたり、Memo1 に表示したりできます。もちろん、
ファイルにおとすのも簡単。上記のコードでは、不正な URL を入力したときの
判断が出来ないので改良の余地があります。Indy などのライブラリは、苦労して
使い方を覚えてもバージョンが変わったりすると使えなくなったりするので、なる
べく低レベルでやりたいと思っています。ほんとは WinInet より WinSocket で
やりたいんで勉強中です。Internet 周りは難しいです。

編集 削除
3へぇ〜  2004-12-03 23:59:49  No: 12014  IP: 192.*.*.*

>TDownLoadURL ってクラスがあるんですか?
ヘルプ見たら、TActionList から TDownLoadURLオブジェクトというのを追加できるんですね。初めて知った…

編集 削除