我想使用TIdHttp(Indy10)實現簡單的http下載程序。我從互聯網上找到了兩種代碼示例。不幸的是他們沒有一個能讓我滿意。這裏是代碼,我想要一些建議。使用TIdHttp逐步下載文件
變1
var
Buffer: TFileStream;
HttpClient: TIdHttp;
begin
Buffer := TFileStream.Create('somefile.exe', fmCreate or fmShareDenyWrite);
try
HttpClient := TIdHttp.Create(nil);
try
HttpClient.Get('http://somewhere.com/somefile.exe', Buffer); // wait until it is done
finally
HttpClient.Free;
end;
finally
Buffer.Free;
end;
end;
代碼緊湊,很容易理解。問題是它在下載開始時分配磁盤空間。另一個問題是我們不能直接在GUI中顯示下載進度,除非代碼在後臺線程中執行(或者我們可以綁定HttpClient.OnWork事件)。
變2:
const
RECV_BUFFER_SIZE = 32768;
var
HttpClient: TIdHttp;
FileSize: Int64;
Buffer: TMemoryStream;
begin
HttpClient := TIdHttp.Create(nil);
try
HttpClient.Head('http://somewhere.com/somefile.exe');
FileSize := HttpClient.Response.ContentLength;
Buffer := TMemoryStream.Create;
try
while Buffer.Size < FileSize do
begin
HttpClient.Request.ContentRangeStart := Buffer.Size;
if Buffer.Size + RECV_BUFFER_SIZE < FileSize then
HttpClient.Request.ContentRangeEnd := Buffer.Size + RECV_BUFFER_SIZE - 1
else
HttpClient.Request.ContentRangeEnd := FileSize;
HttpClient.Get(HttpClient.URL.URI, Buffer); // wait until it is done
Buffer.SaveToFile('somefile.exe');
end;
finally
Buffer.Free;
end;
finally
HttpClient.Free;
end;
end;
首先,我們從服務器查詢該文件的大小,然後我們在分片的下載文件的內容。檢索到的文件內容將在完全收到時保存到磁盤。潛在的問題是我們必須向服務器發送多個GET請求。我不確定某些服務器(如megaupload)是否可能限制特定時間段內的請求數量。
我的期望
- 下載器應只發送一個GET請求到服務器。
- 下載開始時,不得分配磁盤空間。
任何提示表示讚賞。
如果你想有一個緩存'TFileStream',看大衛的貢獻在這裏:[緩衝文件(用於更快的磁盤訪問)](http:/ /stackoverflow.com/a/5639712/576719)。 –