Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Валидный base64 изображения из 1С
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
AIR
Добрый день уважаемые коллеги.
Поясню проблему. Я сам являюсь backend разработчиком на php и просто помогаю решить проблему нашему 1С программисту. Сейчас пишу интернет магазин который плотно взаимодействует с 1С сервером через сервер очередей RabbitMQ.
Суть в том, что бы вся инфа по продуктам выгружалась в 1С и он её отправлял на севрер очередей откуда я своим сайтом её вытягиваю и раскладываю по своей логике. Система в общем то не трудная. И всё было хорошо, пока не столкнулись с передачей изображений.
Решили изображения слать из 1С на сервер очередей в формате base64, который я потом должен оттуда успешно вытащить и собрать в изображение на стороне php. И вроде как 1С кодирует изображения в base64 но эти данные на php просто не собираются в изображения, и валятся ошибкой функции. Проверял я эту base64 строку на валидность на множестве онлайн валидаторов base64 - то же самое. Говорит что неправильный base64.
Может кто делал когда то подобные манипуляции, подскажите как правильно сделать правильный base64 из изображения. Буду очень благодарен. Неделю бьёмся уже над этим )
logist
Может покажите код 1С который кодирует в base64
AIR
Я не силен в 1С и в коде не шарю. Но по логике, вроде как вот этот кусок.

ДвоичныеДанные = Тов.ХранилищеКартинок.ФайлКартинки.Получить();
  Строка64 = Base64Строка(ДвоичныеДанные);
  СтруктураДляКартинки.Вставить("pic", Строка64);

  СообщениеДляКартинкиJSON = json(СтруктураДляКартинки);


И этот base64 далее вставляется в массив JSON со всем остальными данными по изображению.
logist
Что делает "json"? Покажите текст функции

Там где ДвоичныеДанные - могут быть не совсем двоичные данные картинки. Для теста попробуйте так:
ДвоичныеДанные = ОбъектКоторыйХарнитКартинку.ХранилищеЗначенияКартинки.Получить();
ИмяВрФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные .Записать(ИмяВрФайла);
Картинка = Новый Картинка(ИмяВрФайла);
СтрокаBase64 = Base64Строка(Картинка.ПолучитьДвоичныеДанные());
Petre
Какой код кодирования изображения в base64?
Слишком долго читал.
AIR
Цитата(logist @ 21.04.15, 15:37) необходимо зарегистрироваться для просмотра ссылки
Что делает "json"? Покажите текст функции

Там где ДвоичныеДанные - могут быть не совсем двоичные данные картинки. Для теста попробуйте так:
ДвоичныеДанные = ОбъектКоторыйХарнитКартинку.ХранилищеЗначенияКартинки.Получить();
ИмяВрФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные .Записать(ИмяВрФайла);
Картинка = Новый Картинка(ИмяВрФайла);
СтрокаBase64 = Base64Строка(Картинка.ПолучитьДвоичныеДанные());



JSON шлется на сервер очередей для обработки сайтом. А одним из полей json является base64 представление изображения, которое мне нужно уже собрать на стороне сайта.

Цитата(Petre @ 21.04.15, 15:39) необходимо зарегистрироваться для просмотра ссылки
Какой код кодирования изображения в base64?
Слишком долго читал.

В смысле, код? Если Вы про реализацию, то я привел пример уже как наш 1С программист пытается это закодировать.
Petre
Цитата(AIR @ 21.04.15, 16:46) необходимо зарегистрироваться для просмотра ссылки
В смысле, код? Если Вы про реализацию, то я привел пример уже как наш 1С программист пытается это закодировать.

Просто я поздно ответил, и не заметил, что уже есть куча сообщений в теме.

Тут действительно надо смотреть, чему равно ДвоичныеДанные.
AIR
Цитата(Petre @ 21.04.15, 16:10) необходимо зарегистрироваться для просмотра ссылки
Просто я поздно ответил, и не заметил, что уже есть куча сообщений в теме.

Тут действительно надо смотреть, чему равно ДвоичныеДанные.



А есть какой то стандартный алгоритм по шифрованию картинок в base64? Может подскажете, если не тяжело?
Petre
Сделайте просто.
Сохраните картинку в файл.
Получите строку и проверьте ее на валидность:
Картинка = Новый ДвоичныеДанные("c:\1.png");
СтрокаКоторуюНадоПроверитьНаВалидность = Base64Строка(Картинка);

Если все норм, значит надо искать проблему в коде в 1с.
oleshiy
Довелось столкнуться с подобной проблемой. Выяснилось, что при конвертации в base64 1c может добавлять (не уверен, что это происходит всегда, проявилось при конвертации jpeg-ов) к итоговой base64 строке символы перевода строки и возврата каретки. После их исключения файлы декодируются нормально.

Бэйз64Строка = Base64Строка(ДвоичныеДанные);
Бэйз64Строка = СтрЗаменить(Бэйз64Строка, Символы.ВК, "");
Бэйз64Строка = СтрЗаменить(Бэйз64Строка, Символы.ПС, "");
    
Возврат Бэйз64Строка;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.