165 votes

Obtenir l'URL de téléchargement à partir du fichier chargé avec Cloud Functions for Firebase

Après le téléchargement d'un fichier dans Firebase de Stockage avec des Fonctions pour Firebase, je voudrais avoir l'url de téléchargement du fichier.

J'ai ceci :

...

return bucket
    .upload(fromFilePath, {destination: toFilePath})
    .then((err, file) => {

        // Get the download url of file

    });

Le fichier de l'objet a beaucoup de paramètres. Même un nommé mediaLink. Cependant, si j'essaie d'accéder à ce lien, j'obtiens cette erreur :

Les utilisateurs anonymes ne pas avoir de stockage.objets.obtenez l'accès à un objet ...

Quelqu'un peut-il me dire comment obtenir le public à l'Url de téléchargement?

Merci

163voto

James Daniels Points 528

Vous aurez besoin de générer un signé URL à l'aide de getSignedURL via @google-cloud/stockage MNP module.

Exemple:

const gcs = require('@google-cloud/storage')({keyFilename: 'service-account.json'});
// ...
const bucket = gcs.bucket(bucket);
const file = bucket.file(fileName);
return file.getSignedUrl({
  action: 'read',
  expires: '03-09-2491'
}).then(signedUrls => {
  // signedUrls[0] contains the file's public URL
});

Vous aurez besoin d'initialiser @google-cloud/storage avec votre compte de service, les informations d'identification comme l'application par défaut les informations d'identification ne sera pas suffisant.

Mise à JOUR: Le Stockage dans le Cloud SDK peut être accessible via le Firebase Admin SDK, qui agit comme un wrapper autour de @google-cloud/stockage. La seule façon dont il est si vous, soit:

  1. Init le SDK avec un compte de service, généralement au moyen d'un second, non par défaut de l'instance.
  2. Ou, sans un compte de service, en donnant la valeur par défaut de google App Engine compte de service "signBlob" autorisation.

108voto

Drew Beaupre Points 31

Voici un exemple sur la façon de spécifier le jeton de téléchargement lors du téléchargement:

 const UUID = require("uuid-v4");

const fbId = "<YOUR APP ID>";
const fbKeyFile = "./YOUR_AUTH_FIlE.json";
const gcs = require('@google-cloud/storage')({keyFilename: fbKeyFile});
const bucket = gcs.bucket(`${fbId}.appspot.com`);

var upload = (localFile, remoteFile) => {

  let uuid = UUID();

  return bucket.upload(localFile, {
        destination: remoteFile,
        uploadType: "media",
        metadata: {
          contentType: 'image/png',
          metadata: {
            firebaseStorageDownloadTokens: uuid
          }
        }
      })
      .then((data) => {

          let file = data[0];

          return Promise.resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid);
      });
}
 

puis appelez avec

 upload(localPath, remotePath).then( downloadURL => {
    console.log(downloadURL);
  });
 

L'important est qu'il existe un objet metadata imbriqué dans la propriété option metadata . Si vous définissez firebaseStorageDownloadTokens sur une valeur uuid-v4, Cloud Storage l’utilisera comme jeton d’authentification publique.

Merci beaucoup à @martemorfosis

32voto

SMX Points 647

Si vous travaillez sur un Firebase projet, vous pouvez créer signé Url dans un Nuage de Fonction sans inclure d'autres bibliothèques ou le téléchargement des informations d'identification d'un fichier. Vous avez juste besoin d'activer l'API IAM et ajouter un rôle à votre compte de service (voir ci-dessous).

Initialiser l'administrateur de la bibliothèque et obtenir une référence de fichier comme vous le feriez normalement:

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'

admin.initializeApp(functions.config().firebase)

const myFile = admin.storage().bucket().file('path/to/my/file')

Vous générez ensuite signé avec URL

myFile.getSignedUrl({action: 'read', expires: someDateObj}).then(urls => {
    const signedUrl = urls[0]
})

Assurez-vous que votre Firebase compte de service a les autorisations nécessaires pour exécuter cette

  1. Aller à l'API de Google console et activer l'API IAM (https://console.developers.google.com/apis/api/iam.googleapis.com/overview)
  2. Toujours dans l'API console, allez dans le menu principal, "IAM et administration" -> "IAM"
  3. Cliquez sur modifier pour les "App Engine compte de service par défaut" rôle
  4. Cliquez sur "Ajouter un autre rôle", et d'ajouter celui qui est appelé "Compte de Service de Jeton de Créateur"
  5. Économisez et attendez une minute pour que les modifications se propagent

Avec la vanille, Firebase config, la première fois que vous exécutez le code ci-dessus, vous obtiendrez une erreur d'Identité et Access Management (IAM) de l'API n'a pas été utilisé dans le projet XXXXXX avant ou il est désactivé.. Si vous suivez le lien dans le message d'erreur et activer l'API IAM, vous aurez une autre erreur: Permission iam.serviceAccounts.signBlob est nécessaire pour effectuer cette opération sur le compte de service mon-service-compte. L'ajout du Jeton Créateur rôle résout ce deuxième problème d'autorisation.

23voto

Demian S Points 141

Avec les modifications récentes de la réponse aux objets functions, vous pouvez obtenir tout ce dont vous avez besoin pour "assembler" l'URL de téléchargement comme suit:

  const img_url = 'https://firebasestorage.googleapis.com/v0/b/[YOUR BUCKET]/o/'
+ encodeURIComponent(object.name)
+ '?alt=media&token='
+ object.metadata.firebaseStorageDownloadTokens;

console.log('URL',img_url);
 

19voto

martemorfosis Points 119

Une méthode que j'utilise avec succès consiste à définir une valeur UUID v4 sur une clé nommée firebaseStorageDownloadTokens dans les métadonnées du fichier une fois le téléchargement terminé, puis d'assembler moi-même l'URL de téléchargement en suivant la structure que Firebase utilise pour générer. ces URL, par exemple:

 https://firebasestorage.googleapis.com/v0/b/[BUCKET_NAME]/o/[FILE_PATH]?alt=media&token=[THE_TOKEN_YOU_CREATED]
 

Je ne sais pas à quel point cette méthode est "sûre" (étant donné que Firebase pourrait changer la façon dont elle génère les URL de téléchargement à l'avenir), mais elle est facile à implémenter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X