请帮助
我从客户端接收图像并将其保存在文件系统中的服务器上并处理该图像,然后将其上传到Firebase存储中
我尝试通过异步功能从Node.js将图像文件上传到Firebase存储中
const path = process.cwd() + '/my_image.jpg';
const file = readFileSync(path);
await firebase.storage().ref().child('my_image.jpg').put(file);
...
但是我有错误
第一个参数必须是字符串类型或Buffer的实例。收到了Uint8Array的实例
Okey,我尝试二进制格式
const path = process.cwd() + '/my_image.jpg';
const file = readFileSync(path, { encoding: 'base64' });
await firebase.storage().ref().child('my_image.jpg').putString(file, 'base64');
...
我得到错误
Firebase存储:字符串与格式'base64'不匹配:找到无效字符“
我已经尝试了很多东西,但是没有任何效果!我在做什么错?
您可以在此处使用此代码
var admin = require("firebase-admin");
const uuid = require('uuid-v4');
// CHANGE: The path to your service account
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
storageBucket: "<BUCKET_NAME>.appspot.com"
});
var bucket = admin.storage().bucket();
var filename = "path/to/image.png"
async function uploadFile() {
const metadata = {
metadata: {
// This line is very important. It's to create a download token.
firebaseStorageDownloadTokens: uuid()
},
contentType: 'image/png',
cacheControl: 'public, max-age=31536000',
};
// Uploads a local file to the bucket
await bucket.upload(filename, {
// Support for HTTP requests made with `Accept-Encoding: gzip`
gzip: true,
metadata: metadata,
});
console.log(`${filename} uploaded.`);
}
uploadFile().catch(console.error);
要成功运行此代码,您将需要:
"path/to/serviceAccountKey.json"
。 Here是获取指南的指南。<BUCKET_NAME>
。您可以在Firebase Console的“存储”部分找到此名称。值区名称不得包含gs://
或任何其他协议前缀。例如,如果Firebase控制台中显示的存储桶URL为gs://bucket-name.appspot.com
,则将字符串bucket-name.appspot.com
传递给Admin SDK。"path/to/image.png"
。contentType
中相应地调整metadata
。请注意,每当您使用Firebase Console上传图像时,都会自动生成访问令牌。但是,如果您使用任何Admin SDK或gsutil上传图像,则需要自己手动生成此访问令牌。这就是uuid
部分非常重要的原因>
Firebase支持
表示此问题已得到解决,但是我认为任何有此问题的人都应该这样做,而不是等待Firebase修复此问题。对于Node js,有一个名为'@google-cloud/storage
的库>
const {Storage} = require('@google-cloud/storage');
// Creates a client
const storage = new Storage();
const bucket = storage.bucket("my-bucket.appspot.com");
await bucket.upload(
'/my_image_path.jpg',
{
destination: 'my_uploaded_image.jpg',
metadata: {
cacheControl: "public, max-age=315360000",
contentType: "image/jpeg"
}
});
也许您的节点版本不支持带有readFileSync
选项的{ encoding: 'base64' }
功能。