Получить исходное имя файла при загрузке с WebClient
есть ли способ узнать исходное имя файла, который вы загружаете с помощью WebClient, когда Uri не содержит имени?
это происходит, например, на сайтах, где загрузка происходит с динамической страницы, где имя не известно заранее.
используя мой браузер, файл получает имя orrect. Но как это можно сделать с помощью WebClient? Е. Г.
WebClient wc= new WebClient();
var data= wc.DownloadData(@"www.sometime.comgetfile?id=123");
использование DownloadFile() не является решением, так как этот метод нуждается в имени файла в продвижение.
3 ответов
вам нужно изучить заголовки ответов и посмотреть, есть ли заголовок Content-disposition, который включает фактическое имя файла.
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("\"", "");
}
прочитайте заголовок ответа "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);
}
Если вам, как и мне, приходится иметь дело с заголовком Content-Disposition, который неправильно отформатирован или по какой-то причине не может быть автоматически проанализирован классом ContentDisposition, вот мое решение :
string fileName = null;
// Getting file name
var request = WebRequest.Create(url);
request.Method = "HEAD";
using (var response = request.GetResponse())
{
// Headers are not correct... So we need to parse manually
var contentDisposition = response.Headers["Content-Disposition"];
// We delete everything up to and including 'Filename="'
var fileNameMarker= "filename=\"";
var beginIndex = contentDisposition.ToLower().IndexOf(fileNameMarker);
contentDisposition = contentDisposition.Substring(beginIndex + fileNameMarker.Length);
//We only get the string until the next double quote
var fileNameLength = contentDisposition.ToLower().IndexOf("\"");
fileName = contentDisposition.Substring(0, fileNameLength);
}