2013-12-10 4 views
13

Есть ли способ узнать исходное имя файла, который вы загружаете с помощью WebClient, когда Uri не содержит имя?Получить оригинальное имя файла при загрузке с помощью WebClient

Это происходит, например, на сайтах, где загрузка происходит с динамической страницы, где имя неизвестно заранее.

Используя мой браузер, файл получает правильное имя. Но как это можно сделать с помощью WebClient? .

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

Использование DownloadFile() не является решением, так как для этого метода требуется имя файла заранее.

+3

Вы пытались проверить 'wc.ResponseHeaders'? Обычно загрузка файлов содержит заголовок вложения с именем файла. – Tobberoth

+0

Tobberoth. Это действительно ответ! Не знал этого. Огромное спасибо! –

ответ

27

Вы должны проверить заголовки ответа и увидеть, если есть представляет собой заголовок содержания, который содержит фактическое имя файла.

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» может использоваться для синтаксического анализа заголовка «var header = new ContentDisposition (wc.ResponseHeaders [« Content-Disposition »]);' –

+2

Спасибо, но правильным является «.... IndexOf ("filename =") + 9) .... " –

+0

@RaphaelZimermann вы правы. Обновлен мой ответ. Благодарю. – HaukurHaf

5

Прочитайте заголовок ответа "Content-Disposition" с WebClient.ResponseHeaders

Оно должно быть:

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

ваш код должен выглядеть следующим образом:

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

Хороший ответ, но индекс должен быть расширен для учета длины «filename =». IMHO Я бы изменил его на fileName = header.Substring (index + "filename =". Length); – pbarranis

+2

@pbarranis вы правы, исправлены! – giammin

Смежные вопросы