我找到了一些解决方案,但它们太复杂了,或者只是它们不起作用。我必须从服务器下载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的列表包含所有链接和必须下载的文件名。
答案 0 :(得分: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;