Tôi muốn triển khai trình tải xuống http đơn giản bằng TIdHttp (Indy10). Tôi tìm thấy hai loại ví dụ mã từ internet. Thật không may, không ai trong số họ thỏa mãn tôi 100%. Đây là mã và tôi muốn một số lời khuyên.Tải tệp xuống dần dần bằng TIdHttp
Variant 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;
Mã này là nhỏ gọn và rất dễ hiểu. Vấn đề là nó phân bổ không gian đĩa khi tải xuống bắt đầu. Một vấn đề khác là chúng ta không thể hiển thị tiến trình tải xuống trong GUI trực tiếp, trừ khi mã được thực hiện trong một luồng nền (theo cách khác chúng ta có thể ràng buộc sự kiện HttpClient.OnWork).
Biến thể 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;
Đầu tiên chúng ta truy vấn kích thước tập tin từ máy chủ và sau đó chúng tôi tải nội dung tập tin trong miếng. Nội dung tập tin được tải sẽ được lưu vào đĩa khi chúng được nhận hoàn toàn. Vấn đề tiềm năng là chúng ta phải gửi nhiều yêu cầu GET đến máy chủ. Tôi không chắc chắn nếu một số máy chủ (chẳng hạn như megaupload) có thể giới hạn số lượng yêu cầu trong khoảng thời gian cụ thể.
sự mong đợi của tôi
- Các downloader nên chỉ gửi một GET-yêu cầu đến máy chủ.
- Không gian đĩa phải được cấp phát khi quá trình tải xuống bắt đầu.
Bất kỳ gợi ý nào được đánh giá cao.
Nếu bạn muốn có một bộ nhớ đệm 'TFileStream', nhìn vào Đóng góp của David ở đây: [Các tệp đệm (để truy cập đĩa nhanh hơn)] (http://stackoverflow.com/a/5639712/576719). –