image - 从 blob 读取二进制数据以显示 Image React Native
问题描述
这是我必须做的事情的流程:
- 使用图像选择器获取图像以进行本机反应并获取 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}}/>
任何帮助都非常感谢。谢谢
解决方案
实际上我解决了它:理想地阅读 blob 你应该使用readAsArrayBuffer
但它没有在 react native 中实现(另请阅读https://forums.expo.io/t/blob-object-how-can-i-access-the- blobs-raw-data-as-an-arraybuffer/9717)。但是您可以使用readAsDataURL
我正在寻找的内容存储在reader.result
.
const response = await fetch(URL_OF_BINARY_DATA_FILE);
const blob = await response.blob();
var reader = new FileReader();
reader.onload = () => {
console.log(reader.result);
}
reader.readAsDataURL(blob);
推荐阅读
- python - 如何修复“QWizardPage 中的错误布局”
- javascript - javaScript .bind() 不会返回一个新函数,该函数在调用时将具有等于我传递的 arg 的 'this'
- python - 如何填充维度数组
- matlab - 如何修复matlab中的嵌套函数?
- android - 如何使用-sharedpreference 保存最后选择的语言?
- python - 使用 Code::Blocks 构建 OpenCV.cbp 时出现 Python.h 问题
- android - 如何从导航抽屉中在我的活动中制作可点击按钮?
- javascript - 为什么 Sortable 只获取参数中的前 10 个条目?
- r - 为什么以句点开头的对象没有出现在rstudio的全局环境窗格中?
- asp.net-mvc - 如何从请求中选择 MVC 应用程序?