2012-01-12 2 views
3

내가 이렇게 원격 이미지의 다운로드 크기 제한 할 수 있도록 원격 파일의 내용 길이를 얻을하려고 해요 :원격 파일의 올바른 내용 길이를 가져옵니다

WebResponse response = this.GetWebRequest().GetResponse(); 

long contentLength = response.ContentLength; 

// WebResponse.ContentLength doesn't always know the value, 
// it returns -1 in this case. 
if (contentLength == -1) 
{ 
    // Response headers may still have the Content-Length inside of it. 
    string headerContentLength = response.Headers["Content-Length"]; 

    if (!String.IsNullOrWhiteSpace(headerContentLength)) 
    { 
     contentLength = long.Parse(headerContentLength, 
              CultureInfo.InvariantCulture); 
    } 
} 

내 문제가 있다는 것입니다을 content-length 헤더는 선택 사항이기 때문에 때때로 그 값은 결정할 수 없습니다.

herehere 나는 길이를 결정하기 위해 Transfer-Encoding = 청크 된 속성을 어떻게 든 사용할 수 있지만 그 방법에 대한 예는 발견하지 못했음을 나타내는 것처럼 보입니다.

이것이 가능합니까? 누구든지 코드 예제를 제공 할 수 있습니까?

+2

선택 사항입니다. (거의 항상 이미지가 있다고 가정 할지라도) 모든 경우에이 값을 결정할 수는 없습니다. – BrokenGlass

+0

@BrokenGlass 필자는 그렇게 생각했지만 디버깅과 파이어 버그 검사는 그렇지 않은 것으로 나타났습니다. 내가 특별히보고있는 이미지는 다음과 같습니다. http://images.mymovies.net/images/film/cin/500x377/fid10122.jpg –

+0

@James South : 응답에 'Content-Length : 33566'이 표시됩니다. 해당 특정 URL : http://hurl.it/hurls/c79a3f4611819c370e53a30d07958ee1892862b9/ce4aba5e6c9029ed454632536404f2496544c6b0 – Piskvor

답변

3

아니요, 일반적인 경우 불가능합니다.

유일한 방법은 확실 전체 리소스를 다운로드하는 것입니다, 그리고 그것은 얼마나 큰 볼 수 있습니다. 특히 동적으로 생성 된 및/또는 스트리밍 된 리소스의 경우 응답의 크기를 알 수없는 경우가 있습니다 (예 : 라이브 스트림의 경우 반드시 도 정확히 정의 된 시작 또는 끝이). 스트림을 하나의 큰 청크 응답으로 전송할 때).

알 수없는 크기에 대한 해결 방법은 chunked입니다. 청크의 뒤에는 다음 청크 크기 이 붙습니다.; 그러나 얼마나 많은 덩어리가 있을지, 어떤 크기가 될지 예측할 수있는 방법은 없습니다.

또한주의해야합니다 : Content-Length, 2012 년에도 버그보고가 있습니다.

+0

이렇게 열어 볼 방법이 없다면 상한값으로 다운로드 한 다음 청크 연결을 닫으면 닫을 수 있습니까? –

+0

@James South : 오, 물론 - 서버에서 "더 이상의 청크"를 알릴 때까지 열어 요청을 보낸 다음 다운로드를 계속할 수 있습니다.정확하게 * 일어날 때까지 * 알 수있는 방법은 없습니다. * (그 시점에서 당신은 완전한 응답을 가지고 있으며, 당신은 그 바이트 크기를 점검 할 수 있습니다.) – Piskvor

+0

그래서 내가해야 할 일은 각 청크를 한 번에 다운로드하여 다음 청크의 길이를 확인하고 결합 된 길이가 한 입 크기 제한에 도달하면 연결을 닫는 각 청크 길이를 추가하는 것입니다. –

관련 문제