【发布时间】:2015-07-13 03:26:07
【问题描述】:
我找到了一些解决方案,但它们过于复杂或根本不起作用。我必须从服务器下载 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 传递一个包含所有链接和必须下载的文件名的列表。
【问题讨论】:
-
如果您想要文件中的内容,为什么要使用内存流?使用文件流。如果您有多个文件,请使用循环。
-
对文件流使用循环?
-
没有。循环下载每个文件的列表。而不是对 DownloadFile 进行不同的调用。
-
没有。只需对文件名运行一个循环,然后在循环体中调用 DownloadFile。
-
创建一个过程
DownloadFiles并使用2个参数:URLS: TStrings和SavePath: string。现在循环TStrings(例如你传递TStringList),调用DownloadFile(URLS[i]...)并在每次迭代中更新进度条。 P.S:一般IdHTTP是阻塞的,所以如果您在主 UI 线程中使用它,您将体验到非响应式 UI - 最好在单个线程中进行每次下载。有很多例子......