Firebase Storage загрузить файл изображения из Node.js - PullRequest
2 голосов
/ 30 марта 2020

Пожалуйста, помогите

Я получаю изображения от клиента и сохраняю их на своем сервере в файловой системе и обрабатываю это изображение, после чего мне нужно загрузить его в хранилище firebase

Я пытаюсь загрузить файл изображения в хранилище Firebase из Node.js в моей функции asyn c

const path = process.cwd() + '/my_image.jpg';
const file = readFileSync(path);
await firebase.storage().ref().child('my_image.jpg').put(file);
...

Но у меня есть ошибка

Первый аргумент должен иметь тип string или экземпляр буфера. Получен экземпляр Uint8Array

Окей, я пробую двоичный формат

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': обнаружен недопустимый символ "

Я уже много чего пробовал, но ничего не получается! Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 30 марта 2020

Вы можете использовать этот код прямо здесь

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" на путь к своей учетной записи службы. Здесь - руководство для получения вашего.
  • Замените <BUCKET_NAME> на имя вашего ведра по умолчанию. Вы можете найти это имя в разделе «Хранилище» вашей консоли Firebase . Имя корзины не должно содержать gs:// или любых других префиксов протокола. Например, если URL-адрес корзины, отображаемый в консоли Firebase, равен gs://bucket-name.appspot.com, передайте строку bucket-name.appspot.com в Admin SDK.
  • Замените "path/to/image.png" на путь к собственному изображению.
  • При необходимости измените contentType в metadata соответственно.

Просто, чтобы вы знали, когда вы загружаете изображение с помощью Firebase Console, токен доступа будет автоматически сгенерирован. Однако, если вы загружаете изображение с помощью любого Admin SDK или gsutil, вам нужно будет вручную создать этот токен доступа самостоятельно. Вот почему очень важно, что uuid part

Поддержка Firebase говорит, что это исправлено, но я думаю, что любой, имеющий эту проблему, должен go таким образом вместо ожидания Firebase чтобы исправить это.

0 голосов
/ 30 марта 2020

Возможно, ваша версия узла не поддерживает функцию readFileSync с параметром { encoding: 'base64' }.

Попробуйте оригинальный способ преобразования буфера в строку:

const file = readFileSync(path).toString('base64');
// now file is a base64 string
await firebase.storage().ref().child('my_image.jpg').putString(file, 'base64');
0 голосов
/ 30 марта 2020

Для 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"
             }
        });

https://www.npmjs.com/package/@google-cloud / storage

Возможно, вам необходимо подтвердить подлинность nodejs клиент с сервисным ключом Посмотреть это https://cloud.google.com/docs/authentication/getting-started

...