Отправка изображений/файлов через Sockjs + Spring Websocket + Stomp

Я работаю над приложением для обмена сообщениями, используя Spring websockets (STOMP как суб-протокол) и Sockjs.

Я должен предоставить поддержку для отправки файлов в сообщениях.

Согласно этот билет, sockjs не поддерживает двоичные данные, но STOMP делает.

Я знаю, что мы можем конвертировать изображение в base64 и отправлять его поверх stomp, но я думаю, что это не лучшая практика, так как есть много конверсий и накладных расходов. Также мне нужно сохранить сообщения, поэтому для сохранения этих файлов с кодировкой base64 на сервере снова мне придется их декодировать.

У меня есть несколько вопросов:

1) Есть ли способ обхода изображений/файлов поверх sockjs + stomp или конвертация в Base64 - единственный способ?

2) Может быть, это очень глупый вопрос, но согласно этому вопросу можно отправлять двоичные данные по STOMP (без sockjs). Насколько сложно поддерживать резерв без sockjs?

Спасибо.

РЕДАКТИРОВАТЬ: Если использовать base64 - единственный вариант, я скорее сделаю запрос POST для сохранения сообщений, в которых есть вложения, вместо использования кодировки base64. Любые идеи, которые лучше?

Ответы

Ответ 1

Любая реализация Web Socket будет обрабатывать двоичные данные, если кодируется base64. Это по существу сериализует двоичный поток в строку. Все транспорты и обертки сокетов могут обрабатывать строковые данные. Любая реализация Java base64 должна работать.

На стороне браузера base64 обрабатывается изначально в современных браузерах с btoa() и atob(). Если вы поддерживаете устаревшие браузеры, вам может понадобиться polyfill.

Тем не менее, если Java-сервер просто проксирует сообщения между веб-пользователями, вам не нужно будет декодировать изображения на Java, вы просто передадите строковые кодированные изображения из одного подключения сокета к другому.

Ответ 2

У вас есть вид binaryjs. это обещание бинарной потоковой передачи в реальном времени для Интернета с использованием веб-карт.

позволяет проверить примеры

https://github.com/binaryjs/binaryjs/tree/master/examples

Вы должны проверить Atmosphere (wasync), ссылка поможет вам реализовать.

насколько понятен ваш резервный сценарий вашего браузера на стороне клиента, вы можете использовать [base64 polyfill lib (https://github.com/davidchambers/Base64.js/).

С наилучшими пожеланиями

Ответ 3

Другой альтернативой может быть использование WebRTC только для отправки двоичных изображений. Одним из преимуществ этого является то, что эти сообщения были бы чисто одноранговыми. Вам нужно будет реализовать это только в своем веб-приложении, а не в своем бэкэнде. Тогда вам не придется платить за пропускную способность, используемую для изображений. К сожалению, WebRTC не поддерживается IE.