program tip

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

radiobox 2020. 11. 24. 07:52
반응형

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


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


예, 대화하는 HTTP 서버가 다음을 지원 / 허용한다고 가정합니다.

public long GetFileSize(string url)
{
    long result = -1;

    System.Net.WebRequest req = System.Net.WebRequest.Create(url);
    req.Method = "HEAD";
    using (System.Net.WebResponse resp = req.GetResponse())
    {
        if (long.TryParse(resp.Headers.Get("Content-Length"), out long ContentLength))
        {
            result = ContentLength;
        }
    }

    return result;
}

HEAD 메서드 사용이 허용되지 않거나 Content-Length 헤더가 서버 응답에없는 경우 서버의 콘텐츠 크기를 확인하는 유일한 방법은 콘텐츠를 다운로드하는 것입니다. 이것은 특히 신뢰할 수 없기 때문에 대부분의 서버에이 정보가 포함됩니다.


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

예, 이것이 갈 길입니다. 경우 정보가 제공되며,이 같은 헤더입니다 Content-Length. 그러나 반드시 그런 것은 아닙니다.

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

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. 헤더를 수동으로 구문 분석 할 필요가 없습니다 .


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

모든 서버가 HTTP HEAD요청을 수락하는 것은 아닙니다 . 파일 크기를 가져 오는 한 가지 대안 HTTP GET은 응답을 작게 유지하고 응답 콘텐츠 헤더의 일부로 반환 된 메타 데이터에서 파일 크기를 검색하기 위해 파일의 일부만 요청하는 서버를 호출하는 것입니다.

이를 위해 표준을 System.Net.Http.HttpClient사용할 수 있습니다. 요청 메시지 헤더의 바이트 범위를 다음과 같이 설정하여 부분 콘텐츠를 요청합니다.

    request.Headers.Range = new RangeHeaderValue(startByte, endByte)

서버는 전체 파일 크기뿐만 아니라 요청 된 범위를 포함하는 메시지로 응답합니다. 이 정보는 response.Content.Header"Content-Range"키와 함께 응답 콘텐츠 헤더 ( )에 반환됩니다 .

다음은 응답 메시지 콘텐츠 헤더의 콘텐츠 범위 예입니다.

    {
       "Key": "Content-Range",
       "Value": [
         "bytes 0-15/2328372"
       ]
    }

이 예에서 헤더 값은 응답에 0 ~ 15 바이트 (즉, 총 16 바이트)가 포함되어 있고 파일 전체가 2,328,372 바이트임을 의미합니다.

이 메서드의 샘플 구현은 다음과 같습니다.

public static class HttpClientExtensions
{
    public static async Task<long> GetContentSizeAsync(this System.Net.Http.HttpClient client, string url)
    {
        using (var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url))
        {
            // In order to keep the response as small as possible, set the requested byte range to [0,0] (i.e., only the first byte)
            request.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(from: 0, to: 0);

            using (var response = await client.SendAsync(request))
            {
                response.EnsureSuccessStatusCode();

                if (response.StatusCode != System.Net.HttpStatusCode.PartialContent) 
                    throw new System.Net.WebException($"expected partial content response ({System.Net.HttpStatusCode.PartialContent}), instead received: {response.StatusCode}");

                var contentRange = response.Content.Headers.GetValues(@"Content-Range").Single();
                var lengthString = System.Text.RegularExpressions.Regex.Match(contentRange, @"(?<=^bytes\s[0-9]+\-[0-9]+/)[0-9]+$").Value;
                return long.Parse(lengthString);
            }
        }
    }
}

참고 URL : https://stackoverflow.com/questions/122853/how-to-get-the-file-size-from-http-headers

반응형