1

Обычные картинки нормально скачиваются, а он битый получается. Вот ссылка на файл 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;

введите сюда описание изображения

Houl
  • 75
  • Внимательно посмотрите то, что вам отдает сайт, он отдает PDF? Или он отдает например это? А почему он это отдает? Наверно потому, что нет определенных параметров? Например Cookie? Проанализируйте сайт, научитесь понимать что он делает, а не бездумно выполняйте то, что вы хотите. И да, советую найти документацию по WebClient и увидеть нам "Не рекомендуется использовать для новой разработки", то есть WebClient устарел! – EvgeniyZ Jul 06 '21 at 13:54
  • У меня куки стоит, я же говорю, картинки нормально качаются, пдф, нет. Картиинки тоже требуют куки – Houl Jul 06 '21 at 13:56
  • Где? Я в коде их не вижу. Какие? Что анализатор трафика показывает? – EvgeniyZ Jul 06 '21 at 14:03
  • Там нужен 1 кукис ddos_guard_flag=true; – Houl Jul 06 '21 at 14:04
  • А где ваш await? Вы уничтожаете WebClient до того, как загрузка закончится. – VladD Jul 06 '21 at 14:13
  • @VladD DownloadFileAsync - это void – EvgeniyZ Jul 06 '21 at 14:15
  • Студия выдает ошибку с await. Но тут это не важно, можно метод на обычный DownloadFile заменить, рузльтат тот же. Битый pdf – Houl Jul 06 '21 at 14:16

1 Answers1

5

Вы пользуетесь асинхронной функцией DownloadFileAsync, которая не выполняет до конца, а лишь инициирует загрузку. Сразу после этого ваш код выходит из блока using и уничтожает WebClient, который производит загрузку в фоновом режиме, вот файл и получается недогруженный.

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

Возможные решения:

  1. Дождитесь окончания загрузки, подписавшись на DownloadFileCompleted, и только по приходу этого события уничтожайте client.
  2. Сделайте ваш метод асинхронным (async), воспользуйтесь более современной функцией DownloadFileTaskAsync: await client.DownloadFileTaskAsync(...);
  3. Если очень не хочется работать с асинхронными функциями, воспользуйтесь синхронным методом DownloadFile(...), но если вы в UI-потоке, приготовьтесь к подвисаниям.

Я бы рекомендовал альтернативу 2. Ещё можно перейти с давно устаревшего WebClient на современный HttpClient (он весь асинхронный), и использовать что-то наподобие

var sourceStream = await httpClient.GetStreamAsync(new Uri(image));
using (var targetStream = File.Create($@"C:\Work\ ..."))
    await sourceStream.CopyToAsync(targetStream);
VladD
  • 206,799