2013-12-10 23 views
13

Uri adını içermediğinde WebClient'i kullanarak indirdiğiniz bir dosyanın orijinal adını bilmenin bir yolu var mı? Bu, örneğin, yüklemenin adının daha önce bilinmediği bir dinamik sayfadan kaynaklandığı sitelerde olur. Örneğin;WebClient ile karşıdan yükleme yaparken orijinal adı edinin

Tarayıcımı kullanarak, dosya doğru ad alır. Ancak bu nasıl WebClient kullanılarak yapılabilir? E.g. Bu yöntem önceden bir dosya adı ihtiyacı beri DownloadFile() kullanarak

 WebClient wc= new WebClient(); 
     var data= wc.DownloadData(@"www.sometime.com\getfile?id=123"); 

bir çözüm değildir. gibi

Content-Disposition: attachment; filename="fname.ext" 

kodunuzu görünmelidir::

+3

'wc.ResponseHeaders' kontrolünü denediniz mi? Dosya indirme işlemleri genellikle dosya adına sahip bir ek başlığı içerir. – Tobberoth

+0

Tobberoth. Bu gerçekten cevap! Bunu bilmiyordum. Çok çok teşekkür ederim! –

cevap

27

ve görürsem orada gerçek dosya adını içeren bir içerik kullanma başlığıdır.

WebClient wc = new WebClient(); 
var data= wc.DownloadData(@"www.sometime.com\getfile?id=123"); 
string fileName = ""; 

// Try to extract the filename from the Content-Disposition header 
if (!String.IsNullOrEmpty(wc.ResponseHeaders["Content-Disposition"])) 
{ 
fileName = wc.ResponseHeaders["Content-Disposition"].Substring(wc.ResponseHeaders["Content-Disposition"].IndexOf("filename=") + 9).Replace("\"", ""); 
} 
+0

'System.Net.Mime.ContentDisposition',' vari header = new ContentDisposition (wc.ResponseHeaders ["Content-Disposition"]) başlıklarını ayrıştırmak için kullanılabilir; ' –

+2

Teşekkürler, ancak doğru" .... IndexOf ("dosyaadı =") + 9) .... " –

+0

@RaphaelZimermann haklısınız. Cevabımı güncelledi. Teşekkürler. – HaukurHaf

5

WebClient.ResponseHeaders

ile yanıt Başlığını "Content-Disposition" Oku Öyle olmalı Sen tepki başlıklarını incelemek gerekir

string header = wc.ResponseHeaders["Content-Disposition"]??string.Empty; 
const string filename="filename="; 
int index = header.LastIndexOf(filename,StringComparison.OrdinalIgnoreCase); 
if (index > -1) 
{ 
    fileName = header.Substring(index+filename.Length); 
} 
+1

İyi bir yanıt ancak dizinin "dosyaadı =" uzunluğunu hesaba katması için ilerletilmesi gerekiyor. IMHO dosyasını fileName = header.Substring (index + "filename =". Length) olarak değiştirdim; – pbarranis

+2

@pbarranis doğru, düzeltildi! – giammin