2012-01-26 4 views
-1

名前(ファイル名を含む)、URL(ファイルURLを含む)の2つの文字列リストがあります。tstringのデータを使ってファイルをダウンロードするには? DelphiとTHttpGet

for d:=0 to numberOfDownloads-1 do 
begin 
HTTPGet2.URL:=url[d]; 
HTTPGet2.FileName:=name[d]; 
HTTPGet2.GetFile; 
end; 

それは動作しますが、それだけで一つのファイルをダウンロードする - 最初の文字列のリストに: 私は、プログレスバーで、一つのループでTHttpgetを使用して必要なファイルすべてをダウンロードしたいと思います。 どうすればいいですか? numberOfDownloads - 文字列リスト名の項目数。

+0

ここで、THttpGetコンポーネントはどこにありますか?どうしてindyのTIdHTTPコンポーネントを使わないのですか? – RRUZ

+0

私はループを間違えました。 0の星座。 Hmm THTTPGetはフォーム上に置かれます。私はTIdHTTPを使用しようとします。 – gienq

+0

そして 'numberOfDownloads'をどうやって設定しますか? –

答えて

2

HTTPGETダウンロードAセカンダリスレッドを作成し、標準イベントを通知することによって、非同期にファイルを処理します。

したがって、ループを繰り返して2番目のファイルをダウンロードすると、HTTPGet2インスタンスは以前のダウンロードを処理しています。

これを克服するための1つの簡単な方法は...このような何かをインスタンスHTTPGETの配列を作成することです...

var HTTPGets: array of THttpGet; 
    ... 
setlength(HTTPGets,numberOfDownloads); 
... 
for d:=0 to numberOfDownloads-1 do 
    begin 
    HTTPGets[d]:=THttpGet.Create(...); 
    HTTPGets[d].URL:=...; 
    ... 
    HTTPGets[d].GetFile; 
    end; 
end. 

とファイナライズイベントの通知を取得するには、あなたがあなた自身のOnDoneFileを作成する必要がありますそれを設定してください...

HTTPGets[d].OnDoneFile:=HTTPGetOnDone; 
+2

ダウンロード数が多い場合は危険ではありませんか?あなたはスレッドでシステムをあふれさせません。待つほうがいい。 –

+0

@Davidあなたは正しいです、私はちょうどOPが持っていた問題を克服する方法を示すことに集中しました。より堅牢なソリューションのために、私は簡単なスロー・メカニズムを実装し、同時ダウンロード数を制限します。 –

+0

私は 'THttpGet'には待機メカニズムがあります。 –

1

以下のおおよそのコードは、Indyコンポーネントを使用している作業用バージョンから抜粋したものです。それをコンパイルするためにいくつかのギャップを埋める必要がありますが、それはあなたにアイディアを与えるはずです。複数のファイルについては、お使いのループが行うよう繰り返し呼び出し、またはファイル名のリストを呼び出して、内部ループ以下のコード...

type 
    TDownloadResult = (DRSuccess, DRHostNotFound, DRFileNotFound, DRUserCancelled, DROther); 

function TDownload.Download(const aSourceURL: String; 
          const aDestFileName: String; 
          const aShowProgress: Boolean; 
          out aDownloadResult: TDownloadResult; 
          out aErrm: String): boolean; 
var 
    Stream: TMemoryStream; 
    IDAntiFreeze: TIDAntiFreeze; 
begin 
    Screen.Cursor := crHourGlass; 
    aDownloadResult := DROther; 
    aErrm :='Unexpected web error.'; 
    fShowProgress := aShowProgress; 
    if fShowProgress then 
    begin 
     frmProgressBar := TfrmProgressBar.Create(Application.MainForm); 
     frmProgressBar.SetMessage1'Downloading File...'); 
     frmProgressBar.Show; 
    end; 

    fIDHTTP := TIDHTTP.Create; 
    fIDHTTP.HandleRedirects := TRUE; 
    fIDHTTP.AllowCookies := FALSE; 
    fIDHTTP.Request.UserAgent := 'Mozilla/4.0'; 
    fIDHTTP.Request.Connection := 'Keep-Alive'; 
    fIDHTTP.Request.ProxyConnection := 'Keep-Alive'; 
    fIDHTTP.Request.CacheControl := 'no-cache'; 
    fIDHTTP.OnWork := IdHTTP1Work; 
    fIDHTTP.OnWorkBegin := IdHTTP1WorkBegin; 
    IDAntiFreeze := TIDAntiFreeze.Create; 

    Stream := TMemoryStream.Create; 
    try 
    try 
     fIDHTTP.Get(aSourceURL, Stream); 
     if FileExists(aDestFileName) then 
     DeleteFile(PWideChar(aDestFileName)); 
     Stream.SaveToFile(aDestFileName); 
     Result := TRUE; 
     aDownloadResult :=drSuccess; 
    except 
     On E: Exception do 
     begin 
      Result := FALSE; 
      aErrm := E.Message + ' (' + IntToStr(fIDHTTP.ResponseCode) + ')'; 
      if fShowProgress AND fShowProgress AND frmProgressBar.Cancelled then 
      aDownloadResult := DRUserCancelled 
      else if (fIDHTTP.ResponseCode = 404) OR (fIDHTTP.ResponseCode = 302) then 
      aDownloadResult := DRFileNotFound 
      else if (FIDHTTP.ResponseCode = -1) then 
      aDownloadResult := DRHostNotFound 
      else 
      aDownloadResult := DROther; 
     end; 
    end; 
    finally 
    Screen.Cursor := crDefault; 
    Stream.Free; 
    IDAntiFreeze.Free; 
    fIDHTTP.Free; 
    if fShowProgress then 
     frmProgressBar.Free; 
    end; 
end; { Download } 


procedure TDownload.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); 
begin 
    if fShowProgress AND frmProgressBar.Cancelled then 
    raise EUserCancelled.Create(''); 
    if fShowProgress AND (fMaxWork > 0) then 
    frmProgressBar.SetPosition(AWorkCount, GetMsg(MSG_PERCENT_COMPLETE, IntToStr(Round(AWorkCount/fMaxWork * 100)) + '%')); 
end; { IdHTTP1Work } 

procedure TDownload.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); 
begin 
    fMaxWork := AWorkCountMax; 
    if fShowProgress then 
    frmProgressBar.SetMinMax(0, fMaxWork); 
end; { IdHTTP1WorkBegin } 

サンプルの使用を持って、次のいずれか

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Download: TDownload; 
    Errm: String; 
    DownloadResult: TDownloadResult; 
begin 
    Download := TDownload.Create; 
    if NOT TDownload.Download('http://www.URL.com/filename.ext', 
          'c:\junk\au.mpg', TRUE, DownloadResult, Errm) then 
    begin 
     case DownloadResult of 
     DRFileNotFound: ShowMessage ('File not found!!' + #13 + Errm); 
     DRUserCancelled: ShowMessage ('Cancelled!'); 
     DrHostNotFound: ShowMessage ('Are you on line?'); 
     DrOther: ShowMessage ('Other: ' + Errm); 
     else 
     ShowMessage('huh?'); 
     end 
    end 
    else 
    ShowMessage ('Download succeeded!'); 
end; 
関連する問題