2

一時停止/中止されたダウンロードを再開するためのチュートリアル/ソース コードを探していました。ソースコードを見つけましたが、次のエラーが発生します:

procedure TForm1.Download(url, pathLocal : String);
var
   eFile     : TFileStream;
   IdHTTP  : TIdHTTP;

begin
   idHTTP := TIdHTTP.Create(nil);

   if FileExists(pathLocal) then //Caso o arquivo já exista ele o abre, caso contrário cria um novo
      eFile := TFileStream.Create(pathLocal,fmOpenReadWrite)
   else
      eFile := TFileStream.Create(pathLocal,fmCreate);

   try
      try
         eFile.Seek(0,soFromEnd); //Colocando o ponteiro no final do arquivo

         IdHTTP.Head(url); //Buscando informações do arquivo

         if eFile.Position < IdHTTP.Response.ContentLength then //Somente se o arquivo já não foi totalmente baixado
         begin
            IdHTTP.Request.ContentRangeStart := eFile.Position; //Definindo onde deve inciar o download
            IdHTTP.Request.ContentRangeEnd := IdHTTP.Response.ContentLength; //Verificando o tamanho do arquivo

            if eFile.Position > 0 then
            begin //É importante que o range seja definido com o tamanho inicial e o final
               IdHTTP.Request.Range := Format('%d-%d',[eFile.Position,IdHTTP.Response.ContentLength]); 
            end;

            IdHTTP.Get(url,eFile);
         end;
      except
         ShowMessage('Conexão interrompida.');
      end;
   finally
      eFile.Free;
      IdHTTP.Disconnect;
      IdHTTP.Free;
   end;
end;

これはエラーです:

Undeclared identifier: 'Range'

どうすればこれを修正できますか?

4

2 に答える 2

3

プロパティは HTTP 要求には使用されず、ContentRange...HTTP 応答のみに使用されます。それらをコードから完全に取り除いてください。プロパティのみを使用しRangeます (Indy 10 に存在するため、Indy 9 以前を使用していないことを確認してください)。Rangeプロパティ自体に関しては、正しくフォーマットしていません。接頭辞が必要でbytes=あり、終了値を省略して、残りのファイルが必要であることをサーバーに伝えることができます。

IdHTTP.Request.Range := Format('bytes=%d-',[eFile.Position]);

Ranges代わりにプロパティを使用すると、これらの詳細が処理されます (Rangeプロパティは非推奨です)。

IdHTTP.Request.Ranges.Add.StartPos := eFile.Position;

範囲指定されたリクエストを送信する前に、プロパティが最初にHead()設定されているかどうかを確認してください。そうしないと、エラーで失敗したり、指定した範囲に関係なくファイル全体が送信されたりする可能性があります。Response.AcceptRangesbytesGet()

于 2012-03-13T04:36:10.787 に答える
2

あなたの問題は indy version に関連しているようですまた、使用する代わりに、Delphi XE: idHttp & Request.Range, a bug?の例についてこの質問Request.Rangeをチェックしてみてください。Request.Ranges

于 2012-03-13T02:33:55.040 に答える