Atl*_*ila 1 javascript base64 node.js google-cloud-storage
我正在构建一个应用程序,它允许我从访问网络摄像头的 React 应用程序中拍照,然后我需要使用 Hapi node.js 服务器将图像上传到谷歌云存储。我遇到的问题是,反应应用程序拍摄一张图片并给我这个 blob 字符串(我实际上什至不知道这是否是它的名字)但是该字符串非常大,看起来像这样(我已经缩短了它)由于它的尺寸非常大:
"imageBlob": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...
Run Code Online (Sandbox Code Playgroud)
我发现很难找到向我展示如何准确执行此操作的资源,我需要上传该 blob 文件并将其保存到谷歌云存储桶中。
到目前为止,我的应用程序中有这个:
Item.postImageToStorage = async (request, h) => {
const image = request.payload.imageBlob;
const projectId = 'my-project-id'
const keyFilename = 'path-to-my-file'
const gc = new Storage({
projectId: projectId,
keyFilename: keyFilename
})
const bucket = gc.bucket('my-bucket.appspot.com/securityCam');
const blob = bucket.file(image);
const blobStream = blob.createWriteStream();
blobStream.on('error', err => {
h.response({
success: false,
error: err.message || '=-->' + err
})
});
console.log('===---> ', 'no errors::::')
blobStream.on('finish', () => {
console.log('done::::::', `https://storage.googleapis.com/${bucket.name}/${blob.name}`)
// The public URL can be used to directly access the file via HTTP.
const publicUrl = format(
`https://storage.googleapis.com/${bucket.name}/${blob.name}`
);
});
console.log('===---> ', 'past finish::::')
blobStream.end(image);
console.log('===---> ', 'at end::::')
return h.response({
success: true,
})
// Utils.postRequestor(path, payload, headers, timeout)
}
Run Code Online (Sandbox Code Playgroud)
我收到成功消息/响应h.response,但除了 blobStream.on 之外的控制台日志外,没有出现控制台日志。我看到所有以 ===---> 开头的内容,但没有其他内容。
不知道我做错了什么,提前谢谢!
在最高级别,让我们假设您想要写入my-file.dat位于存储桶中的文件my-bucket/my-folder。让我们假设您要写入的数据是一个二进制数据块,存储在由名为 的变量引用的 JavaScript Buffer 对象中my_data。然后我们想要编写类似于以下内容的代码:
const bucket = gc.bucket('my-bucket/my-folder');
const my_file = bucket.file('my-file.dat');
const my_stream = my_file.createWriteStream();
my_stream.write(my_data);
my_stream.end();
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您在行中作为文件名传递的值看起来有些可疑:
const blob = bucket.file(image);
Run Code Online (Sandbox Code Playgroud)
我几乎想象您认为您正在传递文件的内容而不是文件的名称。
另请注意,名为“imageBlob”的 JavaScript 对象字段将是一个字符串。也许这确实是您想要保存的内容,但我也可以想象您想要保存的是与您的网络摄像头图像相对应的二进制数据。在这种情况下,您必须将字符串解码为二进制缓冲区。看起来它将首先提取字符串数据data:image/jpeg;base64,,然后通过将字符串视为 Base64 编码的二进制文件来创建缓冲区。
编辑:修正错别字
| 归档时间: |
|
| 查看次数: |
4084 次 |
| 最近记录: |