Свойство Delphi "IdHTTP.Request.Range": необъявленный идентификатор - PullRequest
2 голосов
/ 13 марта 2012

Я искал учебники / исходные коды для возобновления приостановленных / прерванных загрузок.Я нашел исходный код, но я получаю эту ошибку:

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'

Как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Свойства 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 значение bytes, в противном случае Get() может завершиться ошибкой или отправит вам весь файл независимо от указанного диапазона .

2 голосов
/ 13 марта 2012

Ваша проблема, похоже, связана с вашей версией indy, попробуйте обновить до последней версии indy , также вместо Request.Range попробуйте использовать Request.Ranges, проверьте этот вопрос для примера Delphi XE: idHttp & Request.Range, ошибка?

...