69

ダウンロードする前に http://.../file のサイズを取得したい。ファイルは、Web ページ、画像、またはメディア ファイルです。これは HTTP ヘッダーで実行できますか? ファイルの HTTP ヘッダーだけをダウンロードするにはどうすればよいですか?

4

4 に答える 4

98

はい、あなたが話している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ヘッダーがサーバーの応答に存在しない場合、サーバー上のコンテンツのサイズを判別する唯一の方法は、コンテンツをダウンロードすることです。これは特に信頼できるものではないため、ほとんどのサーバーにこの情報が含まれます。

于 2008-09-23T18:49:26.010 に答える
30

これは HTTP ヘッダーで実行できますか?

はい、これが行く方法です。情報が提供されている場合は、ヘッダーにContent-Length. ただし、必ずしもそうであるとは限らないことに注意してください。

HEADの代わりに requestを使用して、ヘッダーのみをダウンロードできます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

于 2008-09-23T18:35:02.673 に答える
4

HTTP HEADすべてのサーバーがリクエストを受け入れるわけではないことに注意してください。ファイル サイズを取得する別の方法の 1 つは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);
            }
        }
    }
}
于 2018-07-18T03:28:26.687 に答える
1
WebClient webClient = new WebClient();
webClient.OpenRead("http://stackoverflow.com/robots.txt");
long totalSizeBytes= Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]);
Console.WriteLine((totalSizeBytes));
于 2017-10-29T11:42:49.807 に答える