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

这些ContentRange...属性不用于 HTTP 请求,仅用于 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.AcceptRanges属性设置为bytesfirst,否则Get()可能会因错误而失败或向您发送整个文件,而不管您指定的范围如何。

于 2012-03-13T04:36:10.787 回答
2

Your problem it seems related to your indy version , try updating to the last version of indy , also instead of Request.Range try using Request.Ranges check this question for an example Delphi XE: idHttp & Request.Range, a bug?

于 2012-03-13T02:33:55.040 回答