Отправка изображений/файлов через 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.