Образ Vue из base64 или ArrayBuffer
У меня есть бэкэнд flask, который отправляет изображение во фронтенд vue, как описано здесь :
with open('my_image_file.jpg', 'rb') as f:
image_data = f.read()
emit('IMAGE', {'image_data': image_data})
В интерфейсе vue изображение в конечном итоге должно отображаться на веб-странице. Думаю, самый простой способ - как-то сохранить изображение в статической папке. У меня в магазине было бы такое действие:
const actions = {
SOCKET_IMAGE (commit, image) {
console.log("image received")
/* What needs to be done to save image in 'static/' ?*/
commit.commit('image_saved')
}
}
Я также открыт для альтернативных способов сохранить изображение и отобразить его на веб-странице. Могу ли я сохранить изображение прямо в магазине vuex?
Ответы
Вы можете хранить данные изображения в Vuex
Хранить:
const state = {
imgData: null
}
Предполагая, что вы получаете base64от API, зафиксируйте необработанные данные:
commit('SET_IMAGE_DATA', image);
Или, если вы получаете ArrayBuffer, сначала конвертируйте его:
function _arrayBufferToBase64( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
const imgData = _arrayBufferToBase64(image)
commit('SET_IMAGE_DATA', imgData);
ArrayBuffer в метод base64, найденный здесь
И используйте его в своем шаблоне:
<template>
<div>
<img :src="'data:image/png;base64,' + $store.state.imgData" />
</div>
</template>