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

Я использую этот код для загрузки небольших файлов:

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

Но файл сохраняется в ОЗУ перед сохранением на диск, поэтому, например, может быть сложно загрузить файлы > 1 Гб. Есть ли способ скачать файл по частям? Или мне нужно использовать 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