http 헤더에서 파일 크기를 얻는 방법


56

http : /.../ 파일을 다운로드하기 전에 크기를 확인하고 싶습니다. 파일은 웹 페이지, 이미지 또는 미디어 파일 일 수 있습니다. HTTP 헤더로이 작업을 수행 할 수 있습니까? 파일 HTTP 헤더 만 다운로드하려면 어떻게해야합니까?

84

예, 당신이 지원에 얘기 HTTP 서버를 가정 /이 있습니다 서버의 콘텐츠 크기를 확인하는 유일한 방법은 다운로드하는 것입니다. 특히 신뢰할만한 것은 아니므로 대부분의 서버에이 정보가 포함됩니다.

+11

'using '을 사용하면 자동으로 삭제됩니다. http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx 16 apr. 132013-04-16 20:12:14

+2

매우 큰 파일 인'int'만으로이 파일을 사용한다면, 'long ContentLength;와'long.TryParse (xxx)'를 사용하여 2.14GB 이상의 크기 반환 값을 지원합니다. 16 oct. 152015-10-16 04:27:33

  0

http 압축을 사용하지 않으면 실제 파일 크기가 줄어 듭니까? 17 jul. 162016-07-17 23:06:01


25

HTTP 헤더로이 작업을 수행 할 수 있습니까?

네,이 방법이 있습니다. 정보가 제공된 경우 헤더에 Content-Length으로 표시됩니다. 그러나 이것이 반드시 그런 것은 아닙니다.

GET 대신 HEAD 요청을 사용하여 헤더 만 다운로드 할 수 있습니다. 아마 다음 코드는 데 도움이 :

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://example.com/"); 
req.Method = "HEAD"; 
long len; 
using(HttpWebResponse resp = (HttpWebResponse)(req.GetResponse())) 
{ 
    len = resp.ContentLength; 
} 

을 주목 HttpWebResponse 개체의 콘텐츠 길이에 대한 속성이 - 필요가 수동으로 Content-Length 헤더를 구문 분석 없습니다. ,

System.Net.WebRequest req = System.Net.HttpWebRequest.Create("http://stackoverflow.com/robots.txt"); 
req.Method = "HEAD"; 
using (System.Net.WebResponse resp = req.GetResponse()) 
{ 
    int ContentLength; 
    if(int.TryParse(resp.Headers.Get("Content-Length"), out ContentLength)) 
    { 
     //Do something useful with ContentLength here 
    } 
} 

는 HEAD 방법을 사용하는 것이 허용되지 않는 경우, 또는 콘텐츠 길이 헤더가 서버 응답에 존재하지 않는 :

  0

위의'resp.ContentLength'는 HEAD 응답의 길이가 아니며 sizeof를 가져 오는 데 관심이있는 파일의 길이가 아닙니다. 19 apr. 112011-04-19 12:47:28

+1

@Adam No. 설명서에 "ContentLength 속성에 응답과 함께 반환 된 Content-Length 헤더 값이 들어 있습니다." 19 apr. 112011-04-19 12:57:06

+1

고마워요, 콘라드입니다. 20 apr. 112011-04-20 12:15:05

  0

resp.Close()를 호출했는지 확인하십시오. 그렇지 않으면 한 번에 여러 요청을 할 때 시간 초과 오류가 발생할 수 있습니다 (세 번째 요청은 각 응답을 닫음으로써 해결 된 foreach 루프에서 시간 초과되었습니다). 25 mar. 132013-03-25 20:56:43

+2

@Eric 사실 여기에서'Using' 블록을 사용하거나 일회용 패턴을 구현하여 명시 적으로 자원의 수명을 관리하십시오. 수동으로'Close'를 호출하는 것은 오류가 발생하더라도 항상 * 발생하는 것을 보증하지 않는 한 충분하지 않습니다. 25 mar. 132013-03-25 20:59:32

  0

@KonradRudolph 당신은 절대적으로 맞습니다. Close()를 호출하면 테스트하는 동안 내 버그가 해결되었지만이를 사용하는 올바른 방법은 사용하는 블록입니다. Derp. 26 mar. 132013-03-26 00:59:02

  0

@KonradRudolph, FYI,'ContentLength'는'long'을 반환합니다. 큰 문제는 아니지만 문제를 해결하려는 경우에 대비하십시오. 02 may. 132013-05-02 00:14:08


0
WebClient webClient = new WebClient(); 
webClient.OpenRead("http://stackoverflow.com/robots.txt"); 
long totalSizeBytes= Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]); 
Console.WriteLine((totalSizeBytes));