вот поток того, что я должен сделать:
- возьмите изображение с помощью средства выбора изображения для реагирования на нативный и получите данные изображения в 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}}/>
Любая помощь действительно приветствуется. Спасибо