Свойство Delphi IdHTTP.Request.Range: необъявленный идентификатор

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

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'

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


person paulohr    schedule 13.03.2012    source источник


Ответы (2)


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

person Remy Lebeau    schedule 13.03.2012

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

person RRUZ    schedule 13.03.2012
comment
Я установил Indy 10, но эта ошибка не исчезает. Я использую Delphi 7. Пожалуйста, помогите мне :( - person paulohr; 14.03.2012