Имя: Пароль:
1C
1С v8
Скачать изображение во временное хранилище
0 Pyryrym
 
17.08.20
14:47
Мне необходимо, зная адрес изображения, поместить его во временное хранилище. Я собираюсь сделать это с помощью кода:

    Соединение = Новый HTTPСоединение(АдресСервера);
    Запрос = Новый HTTPЗапрос(АдресКартинки);
    Ответ = Соединение.Получить(Запрос);
    ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();


Но я не совсем понимаю, как можно получить адрес сервера. И в принципе, оптимальный ли я выбрал способ загрузки изображений
1 Velis
 
17.08.20
16:31
Адрес сервера это название сайта. Если адрес изображения полный, то можно адрес сервера достать из строки.
Например в example.com/example.jpg example.com - адрес сервера
2 Pyryrym
 
18.08.20
17:07
(1) У меня есть несколько ссылок вида

https://site.ru/picture
http://adress.com/photo
https://www.primer.com/123

Откуда я хочу скачать картинки c помощью кода
    
    Соединение = Новый HTTPСоединение(АдресСервера);
    Запрос = Новый HTTPЗапрос(АдресКартинки);
    Ответ = Соединение.Получить(Запрос);
    ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();

Если я беру адреса сервера "site.ru" "adress.com" "http://www.primer.com"; то никаких ошибок не выскакивает, но файл с последнего сайта не открывается и картинка не отображается (похоже, формат этого файла не поддерживается), если взять адрес без www - "primer.com", то при выполнении выскакивает ошибка

Ошибка при вызове метода контекста (Получить)
        Ответ = Соединение.Получить(Запрос);
по причине:
Ошибка работы с Интернет:   Не могу установить соединение.

Если коротко - то что является адресом сервера в https://www.rom.com/dasdkasjdlklashj?
3 Pyryrym
 
18.08.20
17:08
4 Kassern
 
18.08.20
17:37
Во первых, вы должны понимать какой протокол используется на сайте, http илил https. остюда будет зависеть, будете ли вы подставлять параметр ssl или нет (Соединение = Новый HTTPСоединение("Нужный сайт",,,,,,ssl,);). Далее нужно знать, как получать картинки, использую GET или POST запрос. Это зависит от документации и способа обмена с сайтом. Скорее всего у вас обычный GET запрос. В адрес сайта пишите "http://www.НужныйСайт.ru";, в запрос пишите текст после сайта. например "pictures/simple/600x400.jpg". Лучше всего использовать следующий код, если сайт с ssl:
(пример ссылки на фото "https://www.НужныйСайт.ru/pictures/simple/600x400.jpg";)
ИмяФайла=ПолучитьИмяВременногоФайла("jpg");
ssl = Новый ЗащищенноеСоединениеOpenSSL( неопределено, неопределено );
Соединение = Новый HTTPСоединение("http://www.НужныйСайт.ru",,,,,,ssl,);
ТекстЗапроса = Новый HTTPЗапрос("pictures/simple/600x400.jpg"); //здесь вторым параметром можно указать заголовки, если они необходимы
Ответ=Соединение.ВызватьHTTPМетод("GET",ТекстЗапроса,ИмяФайла);
//В итоге вы получите временный файл с картинкой. А дальше можете ее в двоичные данные переводить, или переместить в нужную папку и т.д.
5 Pyryrym
 
18.08.20
18:07
Попробовал так:


Протокол = ПолучитьПротокол(Строка.Изображение);
    
    Если Протокол = "https" Тогда
        ИмяФайла= ПолучитьИмяВременногоФайла("jpg");
        ssl = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);
        Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl,);
        ТекстЗапроса = Новый HTTPЗапрос(АдресКартинки);//здесь вторым параметром можно указать заголовки, если они необходимы
    
        Ответ=Соединение.ВызватьHTTPМетод("GET",ТекстЗапроса,ИмяФайла);             //Тут ошибка
    КонецЕсли;


Ответ=Соединение.ВызватьHTTPМетод("GET",ТекстЗапроса,ИмяФайла);
по причине:
Ошибка работы с Интернет:   Couldn't resolve host name
6 Pyryrym
 
18.08.20
18:54
(4) вот новый код

    
    Если Протокол = "https" Тогда
        ИмяФайла= ПолучитьИмяВременногоФайла("jpg");
        ssl = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);
        Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl,);
        ТекстЗапроса = Новый HTTPЗапрос(АдресКартинки);//здесь вторым параметром можно указать заголовки, если они необходимы
    
        Ответ = Соединение.ВызватьHTTPМетод("GET", ТекстЗапроса).ПолучитьТелоКакДвоичныеДанные();  //тут двоичные данные
    КонецЕсли;
    
    АдресВХранилище = ПоместитьВоВременноеХранилище(Ответ);  //тут адрес      
        
    СтруктураИмениФайла = ПолучитьСтруктуруИмениФайла(Строка.Изображение);
    
    СсылкаНаФайл = ПрикрепитьФайлКОбъектуНаСервере(АдресВХранилище, СтруктураИмениФайла, СсылкаНаОбъект); // но при вызове функции, файл не записывается т.к. у него размер 0
    УстановитьИзображение(СсылкаНаФайл, Строка.Наименование);
7 Pyryrym
 
18.08.20
19:06
Если использовать такой код

        Если Протокол = "https" Тогда
        ИмяФайла= ПолучитьИмяВременногоФайла("jpg");
        ssl = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);
        Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl,);
        ТекстЗапроса = Новый HTTPЗапрос(АдресКартинки);//здесь вторым параметром можно указать заголовки, если они необходимы
    
        Ответ = Соединение.ВызватьHTTPМетод("GET", ТекстЗапроса, ИмяФайла);
    КонецЕсли;
    
    АдресВХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
        
    СтруктураИмениФайла = ПолучитьСтруктуруИмениФайла(Строка.Изображение);
    
    СсылкаНаФайл = ПрикрепитьФайлКОбъектуНаСервере(АдресВХранилище, СтруктураИмениФайла, СсылкаНаОбъект);
    УстановитьИзображение(СсылкаНаФайл, Строка.Наименование);



То имя файла указывает адрес на моем пк, АдресВХранилище - адрес во ВХ, однако при попытке добавить файл пишет "Каталог не обнаружен"
8 Kassern
 
19.08.20
11:16
(7) по имени файла в отладке проверьте, что картинка корректно записалась. Если это так, то далее смотрите функции по записи картинки в нужное вам место из локального каталога. так же нужно понимать, где вызывается функция загрузки фото. Если на клиенте, то и временный файл будет создан на клиенте. Если вы потом этот файл без доп действий захотите открыть на сервере, который находится на другом компьютере, от кончено, сервер не сможет его открыть, так, как на сервере этого файла по данному пути нет.
9 Pyryrym
 
19.08.20
17:46
(8) Я решил все намного проще

        ИмяФайла = ПолучитьИмяВременногоФайла("jpg");
        
    КопироватьФайл(Строка.Изображение, ИмяФайла);
        ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ИмяФайла);

Чисто "а так можно было",  спасибо за помощь
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший