#javascript #react-native #multipartform-data #form-data #django-channels
#javascript #react-native #multipartform-данные #форма-данные #django-каналы
Вопрос:
Я хочу разрешить пользователям загружать файлы из приложения, это должно быть через соединение WebSocket, и я изо всех сил пытаюсь найти решение для этого, все решения, которые я нашел до сих пор, требуют установки заголовка Content-Type и для соединений WS, которые я все равно не могу найти для этого
Код JavaScript для загрузки файлов:
const fd = new FormData();
fd.append('uri', uri)
// I get the URI from user gallery expo-image-picker
// The URI looks like this: file:/data/user/0/host.exp.exponent/cache/ExperienceData/%40zeyadshaban%2Forgachat/ImagePicker/394f4262-184d-4adc-9a51-db32afcb86a2.png
JSON.stringify({
fd,
type: 'image',
})
В серверной части (consumers.py ) Я попытался сохранить файл напрямую, но он продолжает выдавать ошибку
elif json_data.get('type') == 'image':
my_model_instance.image = json_data.get('fd')
await sync_to_async(my_model_instance.save)()
Когда я ввел json_data.get (‘fd’) в терминал, я получаю следующее
>> json_data.get('fd')
{'_parts': [[...]]}
Ответ №1:
Я бы настоятельно рекомендовал вам не загружать большие объемы данных через соединение websocket, было бы лучше создать другую вспомогательную конечную точку http и использовать ее для загрузки файлов. Кодировка URL-адреса данных, используемая для их встраивания в JSON, увеличит объем передаваемых данных на огромное количество.
Если вы настаиваете на использовании WS для загрузки данных, вам следует использовать двоичный фрейм, а не фрейм JS. Чтобы включить тип содержимого, я предлагаю вам сделать это, создав выделенную конечную точку WS только для загрузки данных, и когда вы устанавливаете соединение с ней, вы сначала отправляете фрейм JSON с информацией (например, типом содержимого), а затем отправляете много двоичных фреймов с данными.
Комментарии:
1. Хорошо, я сделал это с помощью HTTP, но я понятия не имею, как заставить пользователей воспринимать это как обычное текстовое сообщение без необходимости повторного подключения к чату или перезапуска приложения, есть идеи о том, что мне делать?
2. Для отображения изображений вы можете вернуть URL-адрес для этих изображений в websocket, затем вы можете просто создать тег изображения и установить
src
для изображения, после чего браузер загрузит изображение с URL-адреса в фоновом режиме без загрузки страницы. для загрузки используйте ajax-запрос для загрузки изображения.3. Я не знаю, как я об этом не подумал: ( большое вам спасибо!