2013-03-13 129 views
3

我使用此代碼下載小文件:存儲到磁盤之前如何通過TIdHTTP下載大文件?

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

但文件被保存在內存中,因此可能很難下載文件> 1GB,例如。有沒有辦法通過它的部分下載文件?或者我需要使用WinInet?提前致謝!

+3

最簡單的方法是隻使用一個'TFileStream'而不是'TMemoryStream',因爲文件被下載這將寫入磁盤直接的。 'IdHTTP.Get'只是要求一個'TStream',這意味着你可以給它提供任何類型的流。 – 2013-03-13 11:26:41

+1

這就像@Ken說,只需更換'用'TFileStream' TMemoryStream'。無論如何,不​​要忘記使用'try..finally'塊來釋放流。你的代碼最終可能會修改爲['this like like'](http://pastebin.com/GLVEKgLv)。 – TLama 2013-03-13 12:20:13

回答

10

TMemoryStream提供了一個內存緩衝區,因此,如果您下載到一個,你需要有足夠的內存來保存您收到的一切。不過,這不是唯一的一種流式。您可以通過Get方法你想要的任何類型的數據流,其中之一,因爲它接受它寫入其內容的磁盤。例如,使用TFileStream

var 
    s: TStream; 

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

任何你在TMemoryStream致電LoadFromFileSaveToFile,它可能是TFileStream是一個更好的選擇。

+0

謝謝,正是我需要的。 – 2013-03-13 14:02:28

+6

我會打電話去後一步通過使用一個額外的'嘗試/ except'刪除文件's.Free()''如果獲得()'失敗。通過您顯示的代碼,如果下載失敗,文件不會被刪除。除非你想支持恢復損壞的下載,在這種情況下不要刪除文件。 – 2013-03-13 16:50:13