Имя: Пароль:
1C
 
Загрузка картинки по URL
,
0 tomayal
 
28.09.24
20:03
Мне надо сделать так, чтобы при нажатии на кнопку ЗАГРУЗИТЬ КАРТИНКУ в поле картинки появлялась картинка из интернета, но она не появляется и выводит сообщение "Ошибка загрузки картинки: 301"(Код состояния 301 указывает на то, что запрашиваемый ресурс был перемещен на другой URL). Помогите, пожалуйста, разобраться с этим кодом...

&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
    СоединениеHTTP = Новый HTTPСоединение("i.artfile.me");
    ЗапросHTTP = Новый HTTPЗапрос("/wallpaper/21-01-2017/1600x900/anime-hunter-x-hunter-killua-zoldyck-1121649.jpg");
    
    // Выполняем запрос и обрабатываем возможную переадресацию
    РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос
    
    Если РезультатЗапроса.КодСостояния = 200 Тогда
        ДанныеКартинки = РезультатЗапроса.ПолучитьТело();
        Картинка = Новый Картинка(ДанныеКартинки);
        АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Картинка, Новый УникальныйИдентификатор());  
        ЭтотОбъект.АдресКартинки = АдресВоВременномХранилище;  
    Иначе
        Сообщить("Ошибка загрузки картинки: " + РезультатЗапроса.КодСостояния);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьКартинкуЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    АдресКартинки = Адрес;
    Модифицированность = Истина;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
        ТекущийОбъект.Изображение = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресКартинки));
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)      
    АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Изображение");
КонецПроцедуры
1 Волшебник
 
28.09.24
20:13
КопироватьФайл
КопироватьФайлАсинх


Допускается использование схем http, https и ftp для адресации файлов.
2 craxx
 
28.09.24
20:28
(0) ошибка 301 это означает что ты скорее всего делаешь http-запрос к ресурсу, который https.
Судя по коду, так оно и есть
Тебе надо
СоединениеHTTP = Новый HTTPСоединение("i.artfile.me",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
3 tomayal
 
28.09.24
21:00
(2) Помогло, спасибо большое!
4 tomayal
 
28.09.24
21:19
(2) А можете еще подсказать как сделать так, чтобы теперь картинка загружалась по url, записанный в реквизите Путь. выдает сообщение: Некорректный URL.

&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
    ПутьКартинки = Объект.Путь;

    Если ПутьКартинки = "" Тогда
        Сообщить("Путь не указан.");
        Возврат;
    КонецЕсли;

    // есть ли в URL протокол (http или https)
    ИндексСлеша = Найти("/", ПутьКартинки);
    
    Если ИндексСлеша > 0 Тогда
        Домен = Сред(ПутьКартинки, 1, ИндексСлеша);
        Путь = Сред(ПутьКартинки, ИндексСлеша + 1, СтрДлина(ПутьКартинки) - ИндексСлеша);        
        СоединениеHTTP = Новый HTTPСоединение(Домен);
        ЗапросHTTP = Новый HTTPЗапрос(Путь);
        
        РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос

        Если РезультатЗапроса.КодСостояния = 200 Тогда
            ДанныеКартинки = РезультатЗапроса.ПолучитьТелоКакДвоичныеДанные();
            Картинка = Новый Картинка(ДанныеКартинки);
            АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Картинка, Новый УникальныйИдентификатор());  
            ЭтотОбъект.АдресКартинки = АдресВоВременномХранилище;  
        Иначе
            Сообщить("Ошибка загрузки картинки: " + РезультатЗапроса.КодСостояния);
        КонецЕсли;
    Иначе
        Сообщить("Некорректный URL.");
    КонецЕсли;
КонецПроцедуры
5 craxx
 
28.09.24
21:21
(4) Что передается в Объект.Путь?
6 tomayal
 
28.09.24
21:26
(5) В этот реквизит записывается url картинки
8 craxx
 
28.09.24
21:50
(6) А вообще пили путь функцией СтрРазделить
ЧастиПути = СтрРазделить(Объект.Путь,"/",ЛОЖЬ);
Если ЧастиПути.Количество()<2 Тогда
   Сообщить("Некорректный URL.");
   Возврат;
КонецЕсли;
Протокол = СтрЗаменить(ЧастиПути[0],":","");
Домен = ЧастиПути[1];
Для Н = 1 По 2 Цикл
   ЧастиПути.Удалить(0);//удаляем из частей протокол и домен
КонецЦИкла;
Путь = СтрСоединить(ЧастиПути,"/"); //остаток соединяем в путь
/// ну и так далее
9 tomayal
 
28.09.24
22:10
(8) теперь пишет: Ошибка при вызове метода контекста (Получить)    
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP);
по причине:
Ошибка работы с Интернет:  Couldn't resolve host name

&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
    // Используем URL из реквизита Путь
    ПутьКартинки = Объект.Путь;
    
    Если ПутьКартинки = "" Тогда
        Сообщить("Путь не указан.");
        Возврат;
    КонецЕсли;
    
    ЧастиПути = СтрРазделить(Объект.Путь,"/",ЛОЖЬ);
    Если ЧастиПути.Количество()<2 Тогда
        Сообщить("Некорректный URL.");
        Возврат;
    КонецЕсли;
    
    Протокол = СтрЗаменить(ЧастиПути[0],":","");
    Домен = ЧастиПути[1];  
    
    Для Н = 1 По 2 Цикл
        ЧастиПути.Удалить(0);//удаляем из частей протокол и домен
    КонецЦИкла;    
    
    ПутьКартинки = СтрСоединить(ЧастиПути,"/"); //остаток соединяем в путь
    
    СоединениеHTTP = Новый HTTPСоединение(Домен);
    ЗапросHTTP = Новый HTTPЗапрос(ПутьКартинки);
    
    // Выполняем запрос и обрабатываем возможную переадресацию
    РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос
    
    Если РезультатЗапроса.КодСостояния = 200 Тогда
        ДанныеКартинки = РезультатЗапроса.ПолучитьТелоКакДвоичныеДанные();
        Картинка = Новый Картинка(ДанныеКартинки);
        АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Картинка, Новый УникальныйИдентификатор());  
        ЭтотОбъект.АдресКартинки = АдресВоВременномХранилище;  
    Иначе
        Сообщить("Ошибка загрузки картинки: " + РезультатЗапроса.КодСостояния);
    КонецЕсли;
    
КонецПроцедуры
10 craxx
 
28.09.24
22:12
(9) Что показывает отладчик на переменных Протокол, Домен, ПутьКартинки?
11 tomayal
 
28.09.24
22:24
(10) Ошибка работы с Интернет исчезла, но тепер опять пишет код 301

ПутьКартинки    "https://pw.artfile.me/wallpaper/28-09-2024/360x203/tri-bogatyrya--ni-dnya-bez-podviga---202-1713152.jpg"    Строка

Протокол    "https"    Строка

Домен    "pw.artfile.me"    Строка
12 craxx
 
28.09.24
22:47
(11) смотри (2)
у тебя опять в коде http запрос к https
Если Протокол="https" Тогда
   СоединениеHTTP = Новый HTTPСоединение(Домен,,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Иначе
   СоединениеHTTP = Новый HTTPСоединение(Домен);
Конец;
13 getnight
 
28.09.24
22:45
(4) Ну, во-первых, тут ты перепутал порядок параметров
ИндексСлеша = Найти("/", ПутьКартинки);
ИндексСлеша = Найти(ПутьКартинки, "/");

Во-вторых, где-то потерял (2)

В третьих, если ты путь картинки берёшь не полный, тогда вместо
---
Протокол = СтрЗаменить(ЧастиПути[0],":","");
    Домен = ЧастиПути[1];  
    
    Для Н = 1 По 2 Цикл
        ЧастиПути.Удалить(0);//удаляем из частей протокол и домен
    КонецЦИкла;
---
нужно что-то типа
---
Если Найти(ЧастиПути[0], ":") Тогда
    ЗащищённоеСоединение = ?(ЧастиПути[0]="https:", Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
    Домен = ЧастиПути[1];
    ЧастиПути.Удалить(0);
Иначе
    //можешь сам решить, надо тебе это или нет...
    ЗащищённоеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    Домен = ЧастиПути[0];
КонецЕсли;
ЧастиПути.Удалить(0);
---
тогда будет отрабатывать оба варианта... и далее по тексту, с учетом (2), ставишь что-то типа
---
СоединениеHTTP = Новый HTTPСоединение(Домен,,,,,,ЗащищенноеСоединение);
---
извини, код не проверял, но, надеюсь, идея понятна ;)
14 getnight
 
28.09.24
22:49
Подумал и вообще думаю так ещё красивше будет
Если Найти(ЧастиПути[0], ":") Тогда
    ЗащищённоеСоединение = ?(ЧастиПути[0]="https:", Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
    ЧастиПути.Удалить(0);
Иначе
    //можешь сам решить, надо тебе это или нет...
    ЗащищённоеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
КонецЕсли;
Домен = ЧастиПути[0];
ЧастиПути.Удалить(0);
15 craxx
 
28.09.24
22:52
(14) Это там еще порт по умолчанию, а бывает что и порт надо парсить из УРЛа
16 getnight
 
28.09.24
22:58
(15) стараюсь кушать слонов частями по мере их поступления ;) если у достопочтимой Татьяны возникнет такая потребность... будем дальше ковырять ;) просто часто-густо это оказывается мартышкин труд...
17 tomayal
 
29.09.24
11:04
(12) Видимо, слишком сильно откатилась назад, и забыла прописать ЗащищенноеСоединениеOpenSSL

(14) Внесла изменения, которые вы написали и все работает)

Я новичок в 1С, поэтому буду благодарна за любые рекомендации по улучшению кода))

Теперь код выглядит так:
&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
    ПутьКартинки = Объект.Путь;

    Если ПутьКартинки = "" Тогда
        Сообщить("Путь не указан.");
        Возврат;
    КонецЕсли;

    ЧастиПути = СтрРазделить(ПутьКартинки, "/");

    Если ЧастиПути.Количество() < 2 Тогда
        Сообщить("Некорректный URL.");
        Возврат;
    КонецЕсли;

    Если Найти(ЧастиПути[0], ":") Тогда
        ЗащищённоеСоединение = ?(ЧастиПути[0]="https:", Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
        ЧастиПути.Удалить(0);
    Иначе
        ЗащищённоеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    КонецЕсли;

    Домен = ЧастиПути[0];
    ЧастиПути.Удалить(0);
    Путь = СтрСоединить(ЧастиПути, "/");

    СоединениеHTTP = Новый HTTPСоединение(Домен,,,,,,ЗащищённоеСоединение);
    ЗапросHTTP = Новый HTTPЗапрос(Путь);

    РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP);

    Если РезультатЗапроса.КодСостояния = 200 Тогда
        ДанныеКартинки = РезультатЗапроса.ПолучитьТелоКакДвоичныеДанные();
        Картинка = Новый Картинка(ДанныеКартинки);
        АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Картинка, Новый УникальныйИдентификатор());
        ЭтотОбъект.АдресКартинки = АдресВоВременномХранилище;  
    Иначе
        Сообщить("Ошибка загрузки картинки: " + РезультатЗапроса.КодСостояния);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьКартинкуЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    АдресКартинки = Адрес;
    Модифицированность = Истина;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
        ТекущийОбъект.Изображение = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресКартинки));
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)      
    АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Изображение");
КонецПроцедуры
18 Fram
 
29.09.24
11:38
(2) Ну неверная же подсказка. Вернее, не совсем верная. Суть ошибки есть в (0) - запрашиваемый ресурс был перемещен на другой URL. В таких случаях в ответе есть ссылка куда следует сделать еще один запрос. (17) И знание 1С тут как бы не причем. А совет (1) вы почему проигнорировали?
19 novichok79
 
29.09.24
12:21
(17) странно СтрРазделить, но Найти вместо СтрНайти. ну ладно.
еще я бы в попытку это запихнул, 1С часто валится в эксепшн при работе по сетевому стеку.
типа чо будет если интернет поляжет? по-моему эксепшн, но это неточно, года 3 активно не 1Сничаю.
и да, 300-ки - это ж редирект - http редиректит на https.
20 Волшебник
 
29.09.24
12:44
&НаКлиенте
Асинх Процедура ЗагрузитьКартинку(Команда) 
	Адрес = "https://wizard.mista.ru/img/logo.png";
	ВремФайл = ПолучитьИмяВременногоФайла();
	
	Ждать КопироватьФайлАсинх(Адрес,ВремФайл); 
	ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ВремФайл);
	
	КартинкаНаФормеТипаСтрока = ОписаниеФайла.Адрес;
	ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры




21 Fram
 
29.09.24
12:39
(20) ты сейчас ТСу мозг сломал. Она же еще полгода будет вникать в Асинх/Ждать
22 Волшебник
 
29.09.24
12:47
(21) Мне пофиг. Работает же. И строчек гораздо меньше.
Кстати, я это предлагал ещё в (1)
23 Fram
 
29.09.24
12:51
(20) А нафига вызывать Асинх версии функций, если все равно Ждать? Нельзя синх версии функций использовать?
24 Волшебник
 
29.09.24
12:54
(23) Ругается
25 Волшебник
 
29.09.24
13:41
Вот вам более привычный вариант, без асинх/ждать:

&НаКлиенте
Процедура ЗагрузитьКартинку(Команда) 
	Адрес = "https://wizard.mista.ru/img/logo.png";
	ЗагрузитьКартинкуНаСервере(); 
	ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьКартинкуНаСервере() 
	ВремФайл = ПолучитьИмяВременногоФайла();
	
	КопироватьФайл(Адрес,ВремФайл); 
	
	дд = Новый ДвоичныеДанные(ВремФайл);
	Адрес = ПоместитьВоВременноеХранилище(дд);	
	КартинкаНаФормеТипаСтрока = Адрес;
КонецПроцедуры
26 craxx
 
29.09.24
15:33
(18) в случае для (0) верная.
Это 99% случаев для этой ошибки.
27 Fram
 
29.09.24
15:43
(26) Я сомневаюсь что задача грузить одну конкретную картинку