2012-03-13 2 views
2

일시 중지/중단 된 다운로드를 재개 할 수있는 자습서/소스 코드를 찾고있었습니다. 나는 소스 코드를 발견,하지만 난이 오류 받고 있어요 :Delphi "IdHTTP.Request.Range"propertie : 선언되지 않은 식별자

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

귀하의 문제는 ContentRange... 속성은 HTTP 요청을 사용하지 않는 예를 들어 Delphi XE: idHttp & Request.Range, a bug?

+0

인디 10을 설치했지만이 오류가 계속 발생합니다 .. 델파이 7을 사용하고 있습니다 ... 도와주세요 - :( – paulohr

3

에 대한 Request.Ranges 확인이 질문을 사용하여 시도 대신 Request.Range의 또한 last version of indy으로 업데이트하려고 만 HTTP 응답. 코드에서 완전히 제거하십시오. Range 속성 만 사용하십시오 (Indy 10에 존재하므로 Indy 9 이하를 사용하지 않아야합니다). Range 속성 자체에 대해서는 올바르게 서식을 지정하지 않습니다. 그것은 bytes= 접두사를 필요로하고 당신이 파일의 나머지하려는 서버를 알려 종료 값을 생략 할 수 있습니다 : 당신이 대신 Ranges 속성을 사용하는 경우

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

을, 당신합니다 (Range 속성에 대한 그 세부 사항을 처리)는 지원되지 않습니다 : 당신이 원거리 요청을 보내기 전에 Head()가에 Response.AcceptRanges 속성을 설정하면

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

는 반드시 확인 bytes 첫째, 그렇지 않으면 Get() 오류와 함께 실패하거나 지정된 범위에 관계없이 당신에게 전체 파일을 보낼 수 있습니다 .