2010-06-03 14 views
5

वास्तव में मैं इंटरनेट से फ़ाइल डाउनलोड करने के लिए TIdHTTP घटक का उपयोग कर रहा हूं। मैं सोच रहा हूं कि क्या संभव है और इस घटक का उपयोग कर डाउनलोड फिर से शुरू करें ओ शायद एक और इंडी घटक।इंडी घटकों का उपयोग करके डाउनलोड, रोकें और फिर से शुरू करें

यह मेरा वर्तमान कोड है, यह फ़ाइल को डाउनलोड करने के लिए ठीक है (फिर से शुरू किए बिना), लेकिन। अब मैं डाउनलोड को अपने ऐप को बंद करना चाहता हूं, और जब मेरा ऐप पुनरारंभ होता है तो सहेजी गई अंतिम स्थिति से डाउनलोड फिर से शुरू करें।

var 
    Http: TIdHTTP; 
    MS : TMemoryStream; 
begin 
    Result:= True; 
    Http := TIdHTTP.Create(nil); 
    MS := TMemoryStream.Create; 
    try 

    try 
     Http.OnWork:= HttpWork;//this event give me the actual progress of the download process 
     Http.Head(Url); 
     FSize := Http.Response.ContentLength; 
     AddLog('Downloading File '+GetURLFilename(Url)+' - '+FormatFloat('#,',FSize)+' Bytes'); 
     Http.Get(Url, MS); 
     MS.SaveToFile(LocalFile); 
    except 
     on E : Exception do 
     Begin 
     Result:=False; 
     AddLog(E.Message); 
     end; 
    end; 
    finally 
    Http.Free; 
    MS.Free; 
    end; 
end; 

उत्तर

1

हो सकता है कि HTTP रेंज हेडर आपको यहां मदद कर सके। HTTP डाउनलोड को फिर से शुरू करने के बारे में अधिक जानकारी के लिए http://www.west-wind.com/Weblog/posts/244.aspx पर एक नज़र डालें।

इसके अलावा यहां https://forums.embarcadero.com/message.jspa?messageID=219481 एक ही विषय पर TIdHTTP संबंधित चर्चा के लिए देखें।

+0

Embarcadero मंच के लिए लिंक – Brendan

+0

:-(अब मान्य नहीं है मैं एक ही लेख अब और नहीं मिल सकता है, मुझे आशा है कि नीचे इस सवाल का जवाब इस सवाल का जवाब देने के लिए पर्याप्त है: यह मात्रा से फ़ाइल डाउनलोड करता है। –

5

निम्नलिखित कोड मेरे लिए काम किया।

procedure Download(Url,LocalFile:String; 
    WorkBegin:TWorkBeginEvent;Work:TWorkEvent;WorkEnd:TWorkEndEvent); 
var 
    Http: TIdHTTP; 
    exit:Boolean; 
    FLength,aRangeEnd:Integer; 
begin 
    Http := TIdHTTP.Create(nil); 
    fFileStream:=nil; 
    try 

    try 
     Http.OnWork:= Work; 
     Http.OnWorkEnd := WorkEnd; 

     Http.Head(Url); 
     FLength := Http.Response.ContentLength; 
     exit:=false; 
     repeat 

     if not FileExists(LocalFile) then begin 
      fFileStream := TFileStream.Create(LocalFile, fmCreate); 
     end 
     else begin 
      fFileStream := TFileStream.Create(LocalFile, fmOpenReadWrite); 
      exit:= fFileStream.Size >= FLength; 
      if not exit then 
      fFileStream.Seek(Max(0, fFileStream.Size-4096), soFromBeginning); 
     end; 

     try 
      aRangeEnd:=fFileStream.Size + 50000; 

      if aRangeEnd < fLength then begin   
      Http.Request.Range := IntToStr(fFileStream.Position) + '-'+ IntToStr(aRangeEnd); 
      end 
      else begin 
      Http.Request.Range := IntToStr(fFileStream.Position) + '-'; 
      exit:=true; 
      end; 

      Http.Get(Url, fFileStream); 
     finally 
      fFileStream.Free; 
     end; 
    until exit; 
    Http.Disconnect; 

    except 
     on E : Exception do 
     Begin 
     //Result:=False; 
     //AddLog(E.Message); 
     end; 
    end; 
    finally 
    Http.Free; 
    end; 
end; 
संबंधित मुद्दे