문제

다운로드하기 전에 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;
}

헤드 메소드를 사용하지 않거나 서버 응답에 콘텐츠 길이 헤더가 존재하지 않는 경우 서버의 컨텐츠 크기를 결정하는 유일한 방법은 다운로드하는 것입니다. 이것은 특별히 신뢰할 수 없기 때문에 대부분의 서버에는이 정보가 포함됩니다.

다른 팁

HTTP 헤더로 수행 할 수 있습니까?

예, 이것이가는 길입니다. 만약에 정보가 제공되며 헤더에 있습니다. Content-Length. 그러나 이것이 반드시 그런 것은 아닙니다.

헤더 만 다운로드하면 a를 사용하여 수행 할 수 있습니다 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) 키 "콘텐츠 범위"가 있습니다.

응답 메시지 컨텐츠 헤더의 컨텐츠 범위의 예는 다음과 같습니다.

    {
       "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);
            }
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top