Вот последовательность действий, которые я должен сделать:
- взять изображение с помощью средства выбора изображений для реагирования на натив и получить данные изображения в base64 (
sourceData
)
ImagePicker.showImagePicker(imagePickerOptions, (response) => {
const sourceData = { uri: 'data:image/jpeg;base64,' + response.data };
});
Отправка
sourceData.uri
на сервер, работающий локально на моем компьютере:
const data = new FormData();
data.append('receipt', {
uri: sourceData.uri,
type: 'image/jpeg',
name: 'receipt'
});
const response = await fetch(SERVER_POST_ROUTE, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
body: data
});
sourceData.uri
выглядит следующим образом:
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAAA4QAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgA4QEsAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMABgYGBgYGCgYGCg4KCgoOEg4ODg4SFxISEhISFxwXFxcXFxccHBwcHBwcHCIiIiIiIicnJycnLCwsLCwsLCwsLP/bAEMBBwcHCwoLEwoKEy4fGh8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u<…>'
Это серверный POST-маршрут (сокращенный)
router.post('/:id/receipts', (req, res) => {
const id = req.params.id
const expense = expenses.find((expense) => expense.id === id)
if (expense) {
const receipt = req.files.receipt as UploadedFile
const receiptId = `${id}-${expense.receipts.length}`
receipt.mv(`${process.cwd()}/receipts/${receiptId}`, (err) => {
expense.receipts.push({
url: `/receipts/${receiptId}`
})
res.status(200).send(expense)
})
} else {
res.status(404)
}
})
Вот что получает сервер, когда я
console.log(receipt)
{ name: 'receipt',
data:
<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 48 00 48 00 00 ff e1 00 58 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 02 01 12 00 03 00 00 00 01 00 01 ... >,
encoding: '7bit',
truncated: false,
mimetype: 'image/jpeg',
md5: SOME_MD5_STRING,
mv: [Function: mv] }
Как видите, сервер перемещает файл в локальное местоположение
receipt.mv(`${process.cwd()}/receipts/${receiptId}`)
6. МОЯ ПРОБЛЕМА: Мне нужно получить доступ к этому местоположению и превратить то, что я получаю обратно в изображение
Что я делаю прямо сейчас: - Используйте fetch, чтобы получить то, что находится в этом месте, и извлечь blob
const response = await fetch(FILE_LOCAL_URL);
const blob = await response.blob();
- И вот что я получаю, когда я
console.log(blob)
{ _data:
{ size: 23296,
offset: 0,
blobId: 'F8F693CD-6FBB-41C8-95E3-E54EB2A82F63',
type: 'application/octet-stream',
name: '5b996064dfd5b783915112f5-3' } }
Теперь: я не могу понять, как превратить этот двоичный файл вСтрока base64 для добавления к uri
изображения. Это то, что я пытался, но, очевидно, это не работает:
<Image
source={{ uri: 'data:image/jpeg;base64,' + blob._data }}
style={{height: 120, width: 80}}/>
Любая помощь действительно ценится. Спасибо