Websocket отправка и получение изображения с Base64 проблема с полосой пропускания
Я создал веб-сокет с использованием каналов Django и теперь хочу добавить возможность отправки изображений через чат (очевидно, это приложение для чата).
Что я сделал на данный момент:
- Пользователь выбирает изображение (фронтенд)
- Пользователь отправляет его на бэкенд (HTTP POST)
- Я использую сигналы Django (это слушатель для базы данных), чтобы определить, есть ли новое сообщение с добавлением изображения
- Я отправляю изображение обратно через вебсокет
Следующее является проблемой:
- Работает медленно (не слишком заметно, но довольно медленно)
- Иногда вызывает странное поведение
Теперь я подумал об отправке изображения в формате base64 и последующей отправке его обратно напрямую, чтобы у меня никогда не было никакого HTTP, который может быть полезен, потому что это немного быстрее.
НО: Base64 изображения на 20-30 процентов больше, и мне нужно извлечь все exif данные во фронтенде. Есть ли возможность посылать изображения в виде файла через websocket в бэкенд или, если нет, есть ли способ обойти довольно большой размер (20-30 процентов), что является проблемой, потому что я не могу использовать слишком большую пропускную способность :/
Как другие приложения для чата решают эту проблему?
Теперь я использую решение HTTP POST
WebSocket.send() принимает в качестве параметра различные типы данных. Вы можете передавать двоичные данные через WebSocket в обоих направлениях.
На этом фрагменте вы можете увидеть, как использовать его на стороне клиента и сервера на JavaScript. Каналы Django также поддерживают двоичные данные.
Вы можете присоединить любую информацию к двоичным данным из файла и отправить ее вместе с файлом в качестве заголовка.
Например, используя 2 (или 3) байта для указания длины заголовка. Это означает, что до 64 КБ (или до 16 МБ) для такой информации, как имя файла и другой информации, которая может вам понадобиться. В конечном итоге, это похоже на HTTP POST.
Отправленный вами блоб будет выглядеть следующим образом:
len of header | header | file
-------------------+------------------------+-----------
00 00 up to FF FF | infos about the upload | binary
Возможны даже несколько файлов:
< header len >
< header >
< file len >
< file >
< header len file 2 >
< header file 2 >
< file 2 len >
< file 2 >
...and so on
Все, что вам нужно сделать на стороне сервера после этого, это разделить объединенное сообщение обратно на части, определяемые значениями длины.