Как сохранить изображение по прямой ссылке в C#?

romasa464

Client
Регистрация
18.06.2017
Сообщения
70
Благодарностей
12
Баллы
8
Сабж. Из переменной получаю прямую ссылку на файл с изображением, далее, в том же кубике нужно инициировать сохранение изображения в указанную папку.

+ нужно в том числе организовать изменение расширения файла, так как они могут сохранятся с левым расширением.

Подскажите в сторону каких методов смотреть.
Спасибо.
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 480
Благодарностей
5 917
Баллы
113
Поидее это можно сделать обычным гет-запросом.
 
  • Спасибо
Реакции: romasa464

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113

romasa464

Client
Регистрация
18.06.2017
Сообщения
70
Благодарностей
12
Баллы
8

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 480
Благодарностей
5 917
Баллы
113

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
@romasa464
C#:
//укаем УРЛ картинки
string url = @"https://pp.userapi.com/c836336/v836336717/55e5e/oPovdTJx0EE.jpg";

ZennoPoster.HttpGet(
    url, // адрес картинки
    "", // прокси если нужно
    "UTF-8", // кодировка
    ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, // говоим что нужно скачать фаил
    30000, // ждем ответ от сервера
    "", //куки если нужно
    "", //юзерагент если нужно
    true, // использовать редирект
    3, // количество редиректов
    new String[]{}, // заголовки если нужно
    @"E:\", // куда сохранить фаил
    true // использовать оригенальный УРЛ
);
 

romasa464

Client
Регистрация
18.06.2017
Сообщения
70
Благодарностей
12
Баллы
8
@ZHAG

А как правильно заполнить данное поле?

Код:
  new String[]{}, // заголовки если нужно
Т.е. куда указать переменную из которой будут браться названия?

И ещё, а как изменить расширение файла, сразу в коде в процессе скачивания?
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 408
Благодарностей
1 474
Баллы
113
  • Спасибо
Реакции: romasa464

romasa464

Client
Регистрация
18.06.2017
Сообщения
70
Благодарностей
12
Баллы
8

Nord

Client
Регистрация
22.03.2012
Сообщения
2 408
Благодарностей
1 474
Баллы
113

romasa464

Client
Регистрация
18.06.2017
Сообщения
70
Благодарностей
12
Баллы
8
Переименовываешь потом
А не подскажете, как это делать сразу со скачиваемым файлом из кода?
UPD. Вроде нашёл решение. Протестирую, если сработает - скину сюда.

Возникла проблема с URL ардресами для скачивания, не понятно как прописать туда переменную с url адресами.

Код:
Так не работает:

string url = @listlLogin;
ZennoPoster.HttpGet(
    url, // адрес картинки

//И так не работает:
string url = listlLogin;
 
Последнее редактирование:

ScammerS

Client
Регистрация
14.07.2017
Сообщения
75
Благодарностей
8
Баллы
8
var resultHttpGet = ZennoPoster.HttpGet("https://www.google.ru/", "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody);
 

romasa464

Client
Регистрация
18.06.2017
Сообщения
70
Благодарностей
12
Баллы
8
Есть ещё одна очень важная проблема. Я собрал коллекцию по атрибутам. Всего в коллекции 60 элементов (ссылок). Все эти 60 элементов ложатся в 1 переменную. Затем, содержимое этой переменной кладётся в список и файл привязанный к нему. Проблема вот в чём:

В файле каждый элемент с новой строки, но вот в списке они ничем не разделены. Т.е. идут как-бы одной ячейкой. С порядковым номером "0" все 300 спаршенных ссылок могут влезть в 1 строку. Соответственно, когда я беру из списка строку под индексом 0, затем, делаю с ней действие, затем удаляю и возвращаюсь обратно в цикл - он обрывается, т.к. он берёт тот же элемент.

Как разделить строки в списке? Возможно можно как-то разделить коллекцию в процессе записи в переменную или в процессе записи в список. Подскажите, пожалуйста.
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
@romasa464
1. Чувак, ну ты поизучай азы шарпа на МСДНе хоть чтоли :-)
2. на зенно лабе есть отдельная тема по снипетам называется "Бесплатные снипеты на заказ", вот в ней такие вопросы задаются ;-)

C#:
//возмем переменную проекта в снипет, в этой переменной одна строка содержащая урл на файлы для скачивания

/* это тестовый пример данных
http://static.jbcgroup.com/news/pictures/2f3c44887543f7cc692e8f6b3e31cb10.jpg
http://s1.1zoom.me/big0/768/Panthers_The_Jungle_Book_Bagheera_515268_816x1024.jpg
http://xaxa-net.ru/uploads/posts/2016-10/1476628961_vpechatlitelnyy-grim-12_xaxa-net.ru.jpg
http://hostmypics.com/images/2015/04/17/500f72bd3f03ee95700b5cc6b8795312.jpg
*/


//Создай переменную stroka в проекте в разделе переменные,
//ну или измени название stroka на имя той переменной в которой у тебя лежит список ссылок для скачивания
string stroka = project.Variables["stroka"].Value;

//теперь сделаем список из этой переменной чтобы в каждой строчке было по одному УРЛ
//для этого воспользуемся встроенными макросами от зенно
//подробнее смотри на зенновики
List<string> l = Macros.TextProcessing.Split(
    stroka, //это то что нам нужно разделить
    Environment.NewLine, //Укажем разделитель, в твоем случае это новая строка. Но может быть что угодно, хоть буква хоть пробел
    "ALL" // Говорим что мы берем все строки
    ).ToList();

   
//теперь нам нужно пройтись в цикле по каждому элементу списка и скачать файлы
foreach(string url in l){
    ZennoPoster.HttpGet(
        url, // адрес картинки
        "", // прокси если нужно
        "UTF-8", // кодировка
        ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, // говоим что нужно скачать фаил
        30000, // ждем ответ от сервера
        "", //куки если нужно
        "", //юзерагент если нужно
        true, // использовать редирект
        3, // количество редиректов
        new String[]{}, // заголовки если нужно
        @"E:\", // куда сохранить фаил
        true // использовать оригенальный УРЛ
    );
}
//вот твоя задача и решилась
Короче тренируйся ;-)
 
  • Спасибо
Реакции: romasa464

Aleksk

Client
Регистрация
19.06.2013
Сообщения
31
Благодарностей
23
Баллы
8
Из переменной получаю прямую ссылку на файл с изображением, далее, в том же кубике нужно инициировать сохранение изображения в указанную папку.
Можно так:
добавляем в общий код
Код:
public class ImgMy
   {
     public static void ImgParc(string image_url,string image_name, string path )
     {
       
     using (WebClient webClient = new WebClient())
  {
  // webClient.Headers.Add("Referrer", "https://www.google.com.ua"); //
  //webClient.Proxy = new WebProxy("127.0.0.1:8888");
  //webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
         var imageStream = webClient.OpenRead(image_url);
         {
  Image img = Image.FromStream(imageStream);
  img.Save(path+image_name+".jpg"); // сохраняем   
   

  }
   
  }
     
     
     }
     
     
     
   }
Вызываем в кубике
Код:
ImgMy.ImgParc(image_url,"image_name",path);
 
  • Спасибо
Реакции: romasa464

romasa464

Client
Регистрация
18.06.2017
Сообщения
70
Благодарностей
12
Баллы
8
возмем переменную проекта в снипет, в этой переменной одна строка содержащая урл на файлы для скачивани
В том и вещь, что в переменной 60 строк. И если я делаю так, как указано в вашем примере, то он делит только каждую 60 ссылку. В итоге, спарсив ссылки с 3-х страниц, т.е. собрав 180 ссылок, они делятся на 3 строки, по 60 в каждой. И когда я запускаю сохранение через ГЕТ, он скачивает первый файл и крешится.

Я решил сохранять перебирая массив через цикл со счётчиком, вот так:

Код:
//СОБИРАЕМ ССЫЛКИ НА ИЗОБРАЖЕНИЯ      
var saveCount = Convert.ToInt32(project.Variables["saveCount"].Value); //Переменная необходимого количества постов из входных настроек
var currentCount = 0; //Переменная количества найденных элементов

//Цикл, который парсит страницы и складывает результаты в файл, пока их кол-во не сравняется с необходимым
while (currentCount < saveCount)
{       
    //Цикл который не даёт скрипту отрабатывать страницу, пока та не загрузится
    for (int t=0; t<55; t++)
    {   
        project.SendInfoToLog("Ожидаем загрузку элементов..", true);
        HtmlElement searchAtribute = tab.FindElementByAttribute("img", "class", "srp-asset-image", "regexp", 59);
        if (!searchAtribute.IsVoid)
            break;
        else
            System.Threading.Thread.Sleep(1000);
       
    }
        //Ищу собираю коллекцию элементов
        HtmlElementCollection saveImage = tab.FindElementsByAttribute("img", "class", "srp-asset-image", "regexp");   
        currentCount+=saveImage.Count;
        project.SendInfoToLog("currentCount= " + currentCount, true);
        var instanceCount = Convert.ToInt32(currentCount/60);
        project.SendInfoToLog("Собрали коллекцию элементов cо страницы " + instanceCount, true);
        project.SendInfoToLog("Собрано "  + currentCount + " изображений.." , true);
        
        //В этом цикле перебираю элементы по порядковому номеру, так как при каждом цикле в переменную кладётся по 60 элементов, перебираю от 0 до 59 элементов и каждый сохраняется в отдельную строку списка

        for (int ttr = 0; ttr < 60; ttr++)
        {
        var resultss = saveImage.GetByNumber(ttr).GetAttribute( "src" );
        var listInp = project.Lists["result"];
        listInp.Add(resultss);
        }
       
        project.SendInfoToLog("Переходим на новую страницу..", true);
        HtmlElement nextClick = tab.FindElementByAttribute("a", "id", "next-gallery-page", "regexp", 0);
        nextClick.RiseEvent("click", "Full");
//        System.Threading.Thread.Sleep(3000);
        instance.ActiveTab.WaitDownloading();
}

        project.SendInfoToLog("Закончили сбор изображений..", true);
И всё работает, НО от случая к случаю в коллекции ссылок до элемента попадает от 20 до 50% дублей. И я никак не могу это пофиксить.
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
В том и вещь, что в переменной 60 строк. И если я делаю так, как указано в вашем примере, то он делит только каждую 60 ссылку.
Тогда нужно прикладывать сразу варианты чтобы те кто вам помогает не строили догадки.
Чтобы удалить дубли из списка можно использовать следующий код:
C#:
l = l.Distinct().ToList();
 
  • Спасибо
Реакции: Shining и romasa464

Serg24

Client
Регистрация
16.12.2017
Сообщения
51
Благодарностей
4
Баллы
8
Подскажите, если мне в ответе приходит текст (список) и я хочу положить его в список проекта project.Lists["proxy"]
что мне нужно указать вместо
@"E:\", // куда сохранить фаил
 

Serg24

Client
Регистрация
16.12.2017
Сообщения
51
Благодарностей
4
Баллы
8
если указать
@"{-Project.Directory-}", // куда сохранить фаил
то создается файл proxylist.txt
По большому счету, меня и это устраивает, но при повторном запуске уже другой файл proxylist(1).txt генерируется.

Если так,
@"{-Project.Directory-}\proxylist.txt", // куда сохранить фаил
то ничего не происходит.

В идеале нужно типа такого
@"{-Project.Directory-}\project.Lists["proxy"].адрес файла",
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
если список привязан так ложи в список, зачем ты с файлом работаешь ?
 
  • Спасибо
Реакции: Serg24

Serg24

Client
Регистрация
16.12.2017
Сообщения
51
Благодарностей
4
Баллы
8
если список привязан так ложи в список, зачем ты с файлом работаешь ?
уже положил, но из спортивного интереса хочется найти решение.
перепробовал и перечитал массу массу вариантов - все мимо
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
уже положил, но из спортивного интереса хочется найти решение.
перепробовал и перечитал массу массу вариантов - все мимо
если на кубиках то так вроде должно работать

2019-01-21_003551.png
 
  • Спасибо
Реакции: Serg24

Serg24

Client
Регистрация
16.12.2017
Сообщения
51
Благодарностей
4
Баллы
8

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113

Pioneer

Новичок
Регистрация
17.11.2019
Сообщения
13
Благодарностей
0
Баллы
1
столкнулся с проблемой сохранения картинки. причём с одного сайта сохраняет с другого нет . не кубиком не c# не сохраняет с этого сайта.
попробуйте сами если не верите )

вот код каким пытаюсь сохранить
C#:
ZennoPoster.HttpGet(  
        @"https://c.mql5.com/31/477/ea-technic-logo-140x140-3453.png", // адрес картинки
        "", // прокси если нужно
        "UTF-8", // кодировка
        ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, // говоим что нужно скачать фаил
        300, // ждем ответ от сервера
        "", //куки если нужно
        "", //юзерагент если нужно
        true, // использовать редирект
        5, // количество редиректов
        new String[]{}, // заголовки если нужно
        @"D:\temp\", // куда сохранить фаил
        true // использовать оригенальный УРЛ
    );
 

Pioneer

Новичок
Регистрация
17.11.2019
Сообщения
13
Благодарностей
0
Баллы
1
проект пишет успешно выполнен но файл в паке не появляется
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
93
проект пишет успешно выполнен но файл в паке не появляется
1) стоит увеличить таймаут ответа, 300 мс зачастую маловато для картинок (ставим, например, 10000 вместо 300)
300, // ждем ответ от сервера
2) выбрать альтернативный способ передачи запросов в "настройках проекта":

2020-08-11_15-25-41.png
 
  • Спасибо
Реакции: donkasstro и Pioneer

Pioneer

Новичок
Регистрация
17.11.2019
Сообщения
13
Благодарностей
0
Баллы
1
1) стоит увеличить таймаут ответа, 300 мс зачастую маловато для картинок (ставим, например, 10000 вместо 300)
300, // ждем ответ от сервера
2) выбрать альтернативный способ передачи запросов в "настройках проекта":

Посмотреть вложение 61484
Спасибо большое . альтернативный способ помог
 

donkasstro

Client
Регистрация
12.02.2020
Сообщения
52
Благодарностей
8
Баллы
8
Все здравствуйте! Прошу помощи:au:

Я хочу скачать картинку, используя данный код:

@romasa464
C#:
...
    true // использовать оригенальный УРЛ
);
Команда работает, картинка скачивается под своим названием. Подскажите пожалуйста, как изменить код чтобы скачать картинку под другим названием? например, new_file.jpg

и еще вопрос, подскажите пожалуйста, где про этот запрос можно прочитать подробно "ZennoPoster.HttpGet"?

Спасибо!
 

donkasstro

Client
Регистрация
12.02.2020
Сообщения
52
Благодарностей
8
Баллы
8
Все здравствуйте! Прошу помощи:au:

  • Исправлю предыдущее сообщение:
  • Я хочу скачать картинку, используя данный код:



C#:
//укаем УРЛ картинки
string url = @"https://pp.userapi.com/c836336/v836336717/55e5e/oPovdTJx0EE.jpg";

ZennoPoster.HttpGet(
url, // адрес картинки
"", // прокси если нужно
"UTF-8", // кодировка
ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, // говоим что нужно скачать фаил
30000, // ждем ответ от сервера
"", //куки если нужно
"", //юзерагент если нужно
true, // использовать редирект
3, // количество редиректов
new String[]{}, // заголовки если нужно
@"E:\", // куда сохранить фаил
true // использовать оригенальный УРЛ
);

  • Команда работает, картинка скачивается под своим названием. Подскажите пожалуйста, как изменить код чтобы скачать картинку под другим названием? например, new_file.jpg
  • и еще вопрос, подскажите пожалуйста, где про этот запрос можно прочитать подробно "ZennoPoster.HttpGet"?

Спасибо!
 

Кто просматривает тему: (Всего: 5, Пользователи: 0, Гости: 5)