如何使用Node.js将Blob base64字符串上传到Google云存储中
我正在构建一个应用程序,该应用程序将允许我从访问网络摄像头的React应用程序拍摄照片,然后需要使用Hapi node.js服务器将图像上传至Google云存储。我遇到的问题是react应用捕捉了一张图片并给了我这个blob字符串(我什至不知道那是否就是它的名字)但是字符串很大,看起来像这样(我已经缩短了它)由于尺寸非常大:
"imageBlob": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...
[我发现很难找到可以确切显示该方法的资源,我需要上传该Blob文件并将其保存到Google云存储桶中。
到目前为止,我已经在我的应用程序中使用它:
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/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::::::', `/${bucket.name}/${blob.name}`)
// The public URL can be used to directly access the file via HTTP.
const publicUrl = format(
`/${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)
}
我收到成功消息/响应h.response
,但除了blobStream之外的控制台日志以外,没有任何控制台日志出现。我看到所有以=== --->开头的内容,其他都没有。
不确定我在做什么错,谢谢!
回答如下:在最高级别,假设您要写入存储在存储区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();
在您的示例中,看起来有些像fishy,并且您将传入的值作为该行中的文件名:
const blob = bucket.file(image);
我几乎想像您正在考虑传递文件的内容而不是文件名。
还请注意,您的JavaScript对象字段“ imageBlob”将为字符串。可能确实是您要保存的内容,但是我也可以想象您要保存的是与您的网络摄像头图像相对应的二进制数据。在这种情况下,您将必须将字符串解码为二进制缓冲区。看起来它将提取从data:image/jpeg;base64,
开始的字符串数据,然后通过将字符串视为Base64编码的二进制文件从中创建一个缓冲区。
如何使用Node.js将Blob base64字符串上传到Google云存储中
我正在构建一个应用程序,该应用程序将允许我从访问网络摄像头的React应用程序拍摄照片,然后需要使用Hapi node.js服务器将图像上传至Google云存储。我遇到的问题是react应用捕捉了一张图片并给了我这个blob字符串(我什至不知道那是否就是它的名字)但是字符串很大,看起来像这样(我已经缩短了它)由于尺寸非常大:
"imageBlob": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...
[我发现很难找到可以确切显示该方法的资源,我需要上传该Blob文件并将其保存到Google云存储桶中。
到目前为止,我已经在我的应用程序中使用它:
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/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::::::', `/${bucket.name}/${blob.name}`)
// The public URL can be used to directly access the file via HTTP.
const publicUrl = format(
`/${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)
}
我收到成功消息/响应h.response
,但除了blobStream之外的控制台日志以外,没有任何控制台日志出现。我看到所有以=== --->开头的内容,其他都没有。
不确定我在做什么错,谢谢!
回答如下:在最高级别,假设您要写入存储在存储区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();
在您的示例中,看起来有些像fishy,并且您将传入的值作为该行中的文件名:
const blob = bucket.file(image);
我几乎想像您正在考虑传递文件的内容而不是文件名。
还请注意,您的JavaScript对象字段“ imageBlob”将为字符串。可能确实是您要保存的内容,但是我也可以想象您要保存的是与您的网络摄像头图像相对应的二进制数据。在这种情况下,您将必须将字符串解码为二进制缓冲区。看起来它将提取从data:image/jpeg;base64,
开始的字符串数据,然后通过将字符串视为Base64编码的二进制文件从中创建一个缓冲区。