Как мога да изтегля огромен файл чрез TIdHTTP?

Използвам този код за изтегляне на малки файлове:

Var
 ms:TMemoryStream;
begin
  ms:=TMemoryStream.Create;
  Idhttp1.get('http://mydomain.com/myfile.zip',ms);
  ms.SaveToFile('myfile.zip');
  ms.Free;
end;

Но файлът се записва в RAM преди да бъде съхранен на диск, така че може да е трудно да изтеглите файлове >1Gb например. Има ли начин да изтеглите файл по части? Или трябва да използвам WinInet? Благодаря предварително!


person Red October    schedule 13.03.2013    source източник
comment
Най-лесният вариант е просто да използвате TFileStream вместо TMemoryStream, което ще записва на диска директно, докато файлът се изтегля. IdHTTP.Get просто иска TStream, което означава, че можете да предоставите всякакъв тип поток към него.   -  person Ken White    schedule 13.03.2013
comment
Както казва @Ken, просто заменете TMemoryStream с TFileStream. И все пак, не забравяйте да защитите потока да бъде освободен с помощта на try..finally блок. Вашият код може най-накрая да бъде модифициран на something like this.   -  person TLama    schedule 13.03.2013


Отговори (1)


TMemoryStream предоставя буфер в паметта, така че ако изтегляте в такъв, трябва да имате достатъчно памет, за да поберете всичко, което получавате. Това обаче не е единственият вид поток. Можете да подадете на метода Get всякакъв вид поток, който желаете, включително такъв, който записва съдържанието си на диска, докато го получава. Използвайте TFileStream, например.

var
  s: TStream;

s := TFileStream.Create('myfile.zip', fmCreate);
try
  IdHttp1.Get(..., s);
finally
  s.Free;
end;

Където и да се обадите на LoadFromFile или SaveToFile на TMemoryStream, е възможно TFileStream да е по-добър избор.

person Rob Kennedy    schedule 13.03.2013
comment
Благодаря, точно от каквото имам нужда. - person Red October; 13.03.2013
comment
Бих отишъл още една стъпка, като използвам допълнителен try/except за изтриване на файла след извикване на s.Free(), ако Get() не успее. С кода, който показахте, файлът не се изтрива, ако изтеглянето е неуспешно. Освен ако не искате да поддържате възобновяване на прекъснати изтегляния, в който случай не изтривайте файла. - person Remy Lebeau; 13.03.2013