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
'program tip' 카테고리의 다른 글
WebStorm에서 Wordwrap을 설정할 수 있습니까? (0) | 2020.11.24 |
---|---|
Swift에서 'fileprivate'키워드는 무엇을 의미합니까? (0) | 2020.11.24 |
술어는 무엇입니까? (0) | 2020.11.24 |
Visual Studio Team System 2008에서 자동 병합 옵션을 비활성화 할 수 있습니까? (0) | 2020.11.24 |
SQLite를 사용하여 CREATE TABLE 문에서 열을 어떻게 인덱싱합니까? (0) | 2020.11.24 |