0

我找到了一些解决方案,但它们过于复杂或根本不起作用。我必须从服务器下载 200 张图片(小图片,每张约 15 kB)。我认为我可以使用 IdHTTP:

procedure TForm2.DownloadFile(filename, path: string);
var Stream: TMemoryStream;
    Url: String;
begin

  Url := filename;
  Stream := TMemoryStream.Create;

  try
    IdHTTP1.Get(Url, Stream);
    Stream.SaveToFile(path);
  finally
    Stream.Free;
    IdHTTP1.Free;
  end;

end;

这是我猜最常见的方式,它工作得很好。顺便说一句,根据我上面所说的,我必须下载多个文件,解决方案是:

DownloadFile('www.website.com/folder/file1.png', 'C:\folder\file1.png');
DownloadFile('www.website.com/folder/file2.png', 'C:\folder\file2.png');
DownloadFile('www.website.com/folder/file3.png', 'C:\folder\file3.png');

等等。我还有一个进度条,指示下载进度。

问题

有没有更有效的方法来做到这一点?例如,向 IdHTTP 传递一个包含所有链接和必须下载的文件名的列表。

4

1 回答 1

3

您可以使用 TDictionary 之类的泛型:

function DownloadFiles(FilesInfo: TDictionary<string, string>): Boolean;
var
  FileNo: Integer;
  Stream: TFileStream;
begin
  for FileNo := Low to High do
  begin
    Stream := TFileStream.Create(FilesInfo.Values[FileNo], fmCreate);
    try
      IdHTTP1.Get(FilesInfo.Keys[FileNo], Stream);
    finally
      Stream.Free;
    end;
  end;
end;

利用 :

var
  FilesInfo: TDictionary<string, string>;
begin
  FilesInfo := TDictionary<string, string>.Create();
  try
    FilesInfo.Add('www.website.com/folder/file1.png', 'C:\folder\file1.png');
    FilesInfo.Add('www.website.com/folder/file2.png', 'C:\folder\file2.png');
    FilesInfo.Add('www.website.com/folder/file3.png', 'C:\folder\file3.png');
    DownloadFiles(FilesInfo);
  finally
    FilesInfo.Free;
  end;
end;
于 2015-07-12T19:26:07.867 回答