Как загрузить хранилище firebase с помощью firebase admin sdk и вставить тег img html в nodejs с помощью multer?

# #node.js #firebase #vue.js #google-cloud-storage #nuxt.js

Вопрос:

Я создаю систему загрузки изображений. Я хочу использовать sdk администратора Firebase для обработки этого процесса. Как получить URL — адрес для хранения в моем облачном хранилище Google и отобразить его в теге img (html) после завершения загрузки.

 try {
    const file = req.file;
    const bucket = admin.storage().bucket();
    const imageBuffer = Buffer.from(file.buffer, "base64");
    const imageByteArray = new Uint8Array(imageBuffer);
    const options = {
      resumable: false,
      metadata: { contentType: file.mimetype },
      predefinedAcl: "publicRead",
      public: true,
    };
    const files = bucket.file(`img/${file.originalname}`);
    await files.save(imageByteArray, options);
    const field = await files.getMetadata();
    console.log(field);
  } catch (e) {
    console.error(e);
  }
 

Комментарии:

1. Привет, могу я узнать, о каком URL вы говорите? А также не могли бы вы вкратце объяснить свой код, например, что вы делаете или пытаетесь сделать, и что ожидается, но что происходит вместо этого и т. Д.?

Ответ №1:

С помощью Node.js Admin SDK вы должны сделать следующее, используя getSignedUrl() метод:

 const { initializeApp, cert } = require('firebase-admin/app');
const { getStorage } = require('firebase-admin/storage');

const serviceAccount = require('./path/to/serviceAccountKey.json');

initializeApp({
  credential: cert(serviceAccount),
  storageBucket: '<BUCKET_NAME>.appspot.com'
});


// ...

async function getSignedURL(fileName) {
    const bucket = getStorage().bucket();
    // Or const bucket = admin.storage().bucket(); like you do in your question, depending on where and how you execute the code
    const file = bucket.file(fileName);

    const signedURLconfig = { action: 'read', expires: '01-01-2030' };
    // See more options of the config object in the SDK documentation (link above)

    const signedURLArray = await file.getSignedUrl(signedURLconfig);
    return signedURLArray[0];
}


// Use the above function to save the signed URL to Firestore
const fileName = "...";
getSignedURL(fileName)
.then(signedURL => {
    admin.firestore().collection("urls_collection")
    .add({url: signedURL, foo: "bar", bar: "foo"})
});
 

Комментарии:

1. И , затем, как попасть в общедоступный URL-адрес и сохранить его в базе данных?

2. Просто вызовите асинхронный метод getSignedUrl и напишите документ Firestore, содержащий возвращаемое значение, см. Обновление.

3. о , ух ты, огромное тебе спасибо 😊