Node JS / Firebase Admin SDK / Firebase Storage - 上传到 firebase 存储的 base64 图像未生成预览
Node JS / Firebase Admin SDK / Firebase Storage - base64 image uploaded to firebase storage is not generating preview
我正在尝试将从 angular 前端接收到的 base64 图像保存到 firebase 存储目录中。但是保存在 firebase 文件夹中的图像由于某种原因没有生成预览。我在尝试检索图像文件时也无法获得签名 URL。
我正在使用 firebase admin-sdk 生成存储桶引用 - 'storageRef'。
节点后端接收到的图像数据似乎没问题,我用在线 base64 解码器进行了相同的测试,并正确地重新生成了原始图像。有人可以告诉我这里出了什么问题吗?
exports.createContent = async(req, res, next) => {
// Add a new document with a generated id.
const writer = await db.collection('feeds').doc(req.body.language).collection(req.body.type).add({
author: req.body.author,
cat: req.body.cat,
content: req.body.content,
createdAt: admin.firestore.Timestamp.fromDate(new Date(req.body.createdAt)),
excerpt: req.body.excerpt,
lastEdit: admin.firestore.Timestamp.fromDate(new Date(req.body.lastEdit)),
media: req.body.media,
os_android: req.body.os_android === 'true' ? true : false,
os_ios: req.body.os_ios === 'true' ? true : false,
region: req.body.region,
status: req.body.status,
title: req.body.title,
type: req.body.type
}).then((docRef) => {
let bufferStream = new stream.PassThrough();
base64EncodedImageString = req.body.imageSrc.replace(/^data:image\/\w+;base64,/, '');
bufferStream.end(Buffer.from(base64EncodedImageString, 'base64'));
var file = storageRef.file('thumbnail/' + req.body.type + '/' + docRef.id + '.png');
//Pipe the 'bufferStream' into a 'file.createWriteStream' method.
bufferStream.pipe(file.createWriteStream({
metadata: {
contentType: 'image/png',
metadata: {
custom: 'metadata'
}
},
public: true,
validation: "md5"
}))
.on('error', function(err) {
console.log(err);
})
.on('finish', function() {
res.json({
message: "Feeds Added Successfully",
feeds: docRef.id
});
});
})
};
问题是,我在 NodeJS 中使用 firebase-admin SDK,并且我试图根据存储桶的访问规则在我的代码中创建文件 public。因此,我将 public 访问密钥设置为 false,并在上传文件时为该文件生成了一个访问令牌。这解决了这个问题。我在下面包含了我的工作代码。
var stream = require('stream');
const uuidv4 = require('uuid/v4');
const uuid = uuidv4();
let bufferStream = new stream.PassThrough();
var base64EncodedImageString = req.body.imageSrc.replace(/^data:image\/\w+;base64,/, '');
bufferStream.end(new Buffer.from(base64EncodedImageString, 'base64'));
var file = storageRef.file('thumbnail/' + req.body.type + '/' + docRef.id + '.png');
//Pipe the 'bufferStream' into a 'file.createWriteStream' method.
bufferStream.pipe(file.createWriteStream({
metadata: {
contentType: 'image/png',
metadata :{
firebaseStorageDownloadTokens: uuid
}
},
public: false,
validation: 'md5'
}))
.on('error', function(err) {
console.log(err);
})
.on('finish', function() {
res.json({
message: "Feeds Added Successfully",
feeds: docRef.id
});
});
我正在尝试将从 angular 前端接收到的 base64 图像保存到 firebase 存储目录中。但是保存在 firebase 文件夹中的图像由于某种原因没有生成预览。我在尝试检索图像文件时也无法获得签名 URL。
我正在使用 firebase admin-sdk 生成存储桶引用 - 'storageRef'。
节点后端接收到的图像数据似乎没问题,我用在线 base64 解码器进行了相同的测试,并正确地重新生成了原始图像。有人可以告诉我这里出了什么问题吗?
exports.createContent = async(req, res, next) => {
// Add a new document with a generated id.
const writer = await db.collection('feeds').doc(req.body.language).collection(req.body.type).add({
author: req.body.author,
cat: req.body.cat,
content: req.body.content,
createdAt: admin.firestore.Timestamp.fromDate(new Date(req.body.createdAt)),
excerpt: req.body.excerpt,
lastEdit: admin.firestore.Timestamp.fromDate(new Date(req.body.lastEdit)),
media: req.body.media,
os_android: req.body.os_android === 'true' ? true : false,
os_ios: req.body.os_ios === 'true' ? true : false,
region: req.body.region,
status: req.body.status,
title: req.body.title,
type: req.body.type
}).then((docRef) => {
let bufferStream = new stream.PassThrough();
base64EncodedImageString = req.body.imageSrc.replace(/^data:image\/\w+;base64,/, '');
bufferStream.end(Buffer.from(base64EncodedImageString, 'base64'));
var file = storageRef.file('thumbnail/' + req.body.type + '/' + docRef.id + '.png');
//Pipe the 'bufferStream' into a 'file.createWriteStream' method.
bufferStream.pipe(file.createWriteStream({
metadata: {
contentType: 'image/png',
metadata: {
custom: 'metadata'
}
},
public: true,
validation: "md5"
}))
.on('error', function(err) {
console.log(err);
})
.on('finish', function() {
res.json({
message: "Feeds Added Successfully",
feeds: docRef.id
});
});
})
};
问题是,我在 NodeJS 中使用 firebase-admin SDK,并且我试图根据存储桶的访问规则在我的代码中创建文件 public。因此,我将 public 访问密钥设置为 false,并在上传文件时为该文件生成了一个访问令牌。这解决了这个问题。我在下面包含了我的工作代码。
var stream = require('stream');
const uuidv4 = require('uuid/v4');
const uuid = uuidv4();
let bufferStream = new stream.PassThrough();
var base64EncodedImageString = req.body.imageSrc.replace(/^data:image\/\w+;base64,/, '');
bufferStream.end(new Buffer.from(base64EncodedImageString, 'base64'));
var file = storageRef.file('thumbnail/' + req.body.type + '/' + docRef.id + '.png');
//Pipe the 'bufferStream' into a 'file.createWriteStream' method.
bufferStream.pipe(file.createWriteStream({
metadata: {
contentType: 'image/png',
metadata :{
firebaseStorageDownloadTokens: uuid
}
},
public: false,
validation: 'md5'
}))
.on('error', function(err) {
console.log(err);
})
.on('finish', function() {
res.json({
message: "Feeds Added Successfully",
feeds: docRef.id
});
});