httpヘッダーからファイルサイズを取得する方法


56

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

84

はい、あなたは支持体に話をしているHTTPサーバを想定し/これができます:

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

+11

'using'を使うと、それは自動的に削除されます。 http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx 16 4月. 132013-04-16 20:12:14

+2

非常に大きなファイル 'int'でこれを使用している場合は、 'long ContentLength;'と 'long.TryParse(xxx)'を使って2.14GB以上のサイズの戻り値をサポートするようにしました。 16 10月. 152015-10-16 04:27:33

  0

HTTP圧縮が有効になっていないため、実際のファイルサイズが小さくなりますか? 17 7月. 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ヘッダを解析する必要はありませんが。

  0

上記の 'resp.ContentLength'は、あなたがsizeofを取得するのに興味があったファイルの長さではなく、HEAD応答の長さを与えませんか? 19 4月. 112011-04-19 12:47:28

+1

@Adamいいえドキュメントには、「ContentLengthプロパティにはレスポンスとともに返されるContent-Lengthヘッダーの値が含まれています。」 19 4月. 112011-04-19 12:57:06

+1

ありがとう、Konradありがとうございます。 20 4月. 112011-04-20 12:15:05

  0

resp.Close()を呼び出すか、一度に複数のリクエストを作成するときにタイムアウトエラーが発生する可能性があります(私の3番目のリクエストは、各応答を閉じることによって解決されたforeachループでタイムアウトしていました) 25 3月. 132013-03-25 20:56:43

+2

@Ericここで 'Using'ブロックを使うか、リソースのライフタイムを明示的に管理する使い捨てパターンを実装してください。手動で 'Close'を呼び出すだけでは、エラーの場合でも*常に*起こることを保証しない限り、十分ではありません。 25 3月. 132013-03-25 20:59:32

  0

@KonradRudolphあなたは絶対に正しいです。 Close()を呼び出すと、これをテストしている間にバグが修正されましたが、使用するブロックが正しい方法です。 Derp。 26 3月. 132013-03-26 00:59:02

  0

@KonradRudolph、FYI、 'ContentLength'は' long'を返します。大したことではなく、あなたがそれを修正したい場合に備えて。 02 5月. 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));