http başlıklarından dosya boyutu nasıl elde edilir


56

Bir http: /.../ dosyasının boyutunu, indirmeden önce almak istiyorum. Dosya bir web sayfası, resim veya bir medya dosyası olabilir. Bu HTTP üstbilgileri ile yapılabilir mi? Sadece HTTP üstbilgisini nasıl indirebilirim?

84

Evet, desteklerin konuştuğunuz HTTP sunucusunu varsayarak/Bu veriyor Sunucudaki içeriğin boyutunu belirlemenin tek yolu onu indirmektir. Bu özellikle güvenilir olmadığından, çoğu sunucu bu bilgileri içerecektir.

+11

Eğer 'using' kullanıyorsanız, otomatik olarak onu atar. http://msdn.microsoft.com/tr-tr/library/yh598w02(v=vs.110).aspx 16 nis. 132013-04-16 20:12:14

+2

Başka bir not, eğer bu son derece büyük dosyalar için kullanılıyorsa, int 'yeterli olmaz, ihtiyacınız olacak Uzun ContentLength, 've' long.TryParse (xxx) 'i kullanmak için 2.14GB boyutundaki bir dönüş değerinden daha fazlasını destekleyin. 16 eki. 152015-10-16 04:27:33

  0

http sıkıştırması etkin değil gerçek dosya boyutunu atmak değil mi? 17 tem. 162016-07-17 23:06:01


25

Bu, HTTP üstbilgileriyle yapılabilir mi?

Evet, işte bu yol. bilgisi varsa, Content-Length olarak üstbilgide bulunur. Bununla birlikte, bunun mutlaka gerekli olmadığını unutmayın.

Yalnızca üstbilgi indirme işlemi GET yerine HEAD isteği kullanılarak yapılabilir. Belki şu kod yardımcı olur:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://example.com/"); 
req.Method = "HEAD"; 
long len; 
using(HttpWebResponse resp = (HttpWebResponse)(req.GetResponse())) 
{ 
    len = resp.ContentLength; 
} 

Bildirimi HttpWebResponse nesne üzerinde içerik uzunluğu için özelliği - gerek elle Content-Length başlığını ayrıştırmak. ,

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 
    } 
} 

BAŞ yöntemi kullanılarak izin verilmez ise veya içerik-uzunluk başlığı sunucu cevapta mevcut değildir:

  0

Will değil 'size BAŞ yanıtın uzunluğunu göre değil, sizeof almakla ilgi dosyasının uzunluğu vermek için yukarıdaki resp.ContentLength'? 19 nis. 112011-04-19 12:47:28

+1

@Adam No. Belgeler şunları söylüyor: “ContentLength özelliği, yanıtla döndürülen Content-Length başlığının değerini içerir.” 19 nis. 112011-04-19 12:57:06

+1

Doğru, teşekkürler Konrad. 20 nis. 112011-04-20 12:15:05

  0

Resp.Close() yöntemini çağırdığınızdan emin olun veya bir seferde birden çok istekte bulunulduğunda zaman aşımı hatalarıyla karşılaşabilirsiniz (üçüncü isteğim, yanıtı çözerek çözülen bir foreach döngüsünde zaman aşımına uğradı) 25 mar. 132013-03-25 20:56:43

+2

@Eric Aslında Burada bir 'kullanma 'bloğunu kullanın veya kaynağın ömrünü açıkça yönetmek için tek kullanımlık modeli uygulayın. Hata durumunda bile, * her zaman * olduğunu garanti etmedikçe, 'Kapat' kelimesini elle çağırmak yeterli değildir. 25 mar. 132013-03-25 20:59:32

  0

@KonradRudolph Kesinlikle haklısınız. Ben bunu test ederken Close() öğesini çağırmak hatayı düzeltdi, ancak bir blok kullanmak için doğru yoldur. Derp. 26 mar. 132013-03-26 00:59:02

  0

@KonradRudolph, FYI, ContentLength, bir 'long' döndürür. Büyük bir anlaşma değil, sadece düzeltmek istediğiniz durumda. 02 may. 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));