Node.js的Firebase存储上载图像文件

问题描述 投票:2回答:3

请帮助

我从客户端接收图像并将其保存在文件系统中的服务器上并处理该图像,然后将其上传到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'不匹配:找到无效字符“

我已经尝试了很多东西,但是没有任何效果!我在做什么错?

node.js firebase firebase-storage fs
3个回答
2
投票

您可以在此处使用此代码

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);

要成功运行此代码,您将需要:

  • 将Firebase Admin SDK添加到您的服务器
  • 安装uuid-v4
  • 用您自己的服务帐户的路径替换"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修复此问题。

0
投票

对于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"
             }
        });

0
投票

也许您的节点版本不支持带有readFileSync选项的{ encoding: 'base64' }功能。

© www.soinside.com 2019 - 2024. All rights reserved.