Не скачивается .pdf файл
Обычные картинки нормально скачиваются, а он битый получается.
Вот ссылка на файл https://www.margroid.ru/upload/fitting.pdf
Вот это код:
string image = link;
string konec1 = image.Substring(image.LastIndexOf("."), image.Length - image.LastIndexOf("."));
if (!image.Contains("http"))
image = host + image;
Directory.CreateDirectory($@"C:\Work\{sitename}\" + NA);
using (WebClient client = new WebClient())
{
client.DownloadFileAsync(new Uri(image), $@"C:\Work\{sitename}\" + NA + @"\" + number_image + konec1);
}
string gg = $"/upload/staff/upload/staff/{sitename}/" + NA + "/" + number_image + konec1 + ";\r\n";
number_image++;
return gg;
Ответы (1 шт):
Вы пользуетесь асинхронной функцией DownloadFileAsync, которая не выполняет до конца, а лишь инициирует загрузку. Сразу после этого ваш код выходит из блока using и уничтожает WebClient, который производит загрузку в фоновом режиме, вот файл и получается недогруженный.
Если для маленьких файлов ваш WebClient иногда успевает загрузить весь файл, то для больших происходят очевидные проблемы.
Возможные решения:
- Дождитесь окончания загрузки, подписавшись на
DownloadFileCompleted, и только по приходу этого события уничтожайтеclient. - Сделайте ваш метод асинхронным (
async), воспользуйтесь более современной функциейDownloadFileTaskAsync:await client.DownloadFileTaskAsync(...); - Если очень не хочется работать с асинхронными функциями, воспользуйтесь синхронным методом
DownloadFile(...), но если вы в UI-потоке, приготовьтесь к подвисаниям.
Я бы рекомендовал альтернативу 2. Ещё можно перейти с давно устаревшего WebClient на современный HttpClient (он весь асинхронный), и использовать что-то наподобие
var sourceStream = await httpClient.GetStreamAsync(new Uri(image));
using (var targetStream = File.Create($@"C:\Work\ ..."))
await sourceStream.CopyToAsync(targetStream);
