|
Загрузка картинки по 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) Я сомневаюсь что задача грузить одну конкретную картинку
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |