Après avoir téléchargé un fichier dans Firebase Storage avec des fonctions pour Firebase, j'aimerais obtenir 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 objet contient de nombreux paramètres. Même un nommé mediaLink
. Cependant, si j'essaye d'accéder à ce lien, j'obtiens cette erreur:
Les utilisateurs anonymes n'ont pas accès à storage.objects.get à l'objet ...
Quelqu'un peut-il me dire comment obtenir l'URL de téléchargement publique?
Je vous remercie
Réponses:
Vous devrez générer une URL signée à l'aide de getSignedURL via le module NPM @ google-cloud / storage .
Exemple:
Vous devrez initialiser
@google-cloud/storage
avec les informations d' identification de votre compte de service, car les informations d'identification par défaut de l'application ne seront pas suffisantes.MISE À JOUR : Le SDK Cloud Storage est désormais accessible via le SDK Firebase Admin, qui agit comme un wrapper autour de @ google-cloud / storage. La seule façon de procéder est que vous:
la source
action
etexpires
?Voici un exemple sur la façon de spécifier le jeton de téléchargement lors du téléchargement:
puis appelez avec
L'essentiel ici est qu'il y a un
metadata
objet imbriqué dans lametadata
propriété option. La définitionfirebaseStorageDownloadTokens
d'une valeur uuid-v4 indiquera à Cloud Storage de l'utiliser comme jeton d'authentification public.Un grand merci à @martemorfosis
la source
Cette réponse résume les options pour obtenir l'URL de téléchargement lors du téléchargement d'un fichier sur Google / Firebase Cloud Storage. Il existe trois types d'URL de téléchargement:
Il existe trois façons d'obtenir une URL de téléchargement de jeton. Les deux autres URL de téléchargement n'ont qu'un seul moyen de les obtenir.
Depuis la console de stockage Firebase
Vous pouvez obtenir l'URL de téléchargement depuis la console Firebase Storage:
L'URL de téléchargement ressemble à ceci:
La première partie est un chemin standard vers votre fichier. À la fin se trouve le jeton. Cette URL de téléchargement est permanente, c'est-à-dire qu'elle n'expirera pas, bien que vous puissiez la révoquer.
getDownloadURL () depuis le frontal
La documentation nous dit d'utiliser
getDownloadURL()
:Cela obtient la même URL de téléchargement que celle que vous pouvez obtenir depuis votre console Firebase Storage. Cette méthode est simple mais nécessite que vous connaissiez le chemin d'accès à votre fichier, qui dans mon application compte environ 300 lignes de code, pour une structure de base de données relativement simple. Si votre base de données est complexe, ce serait un cauchemar. Et vous pouvez télécharger des fichiers depuis le frontal, mais cela exposerait vos informations d'identification à quiconque télécharge votre application. Ainsi, pour la plupart des projets, vous voudrez télécharger vos fichiers depuis votre back-end Node ou Google Cloud Functions, puis obtenir l'URL de téléchargement et l'enregistrer dans votre base de données avec d'autres données sur votre fichier.
getSignedUrl () pour les URL de téléchargement temporaires
getSignedUrl () est facile à utiliser à partir d'un back-end Node ou de Google Cloud Functions:
Une URL de téléchargement signée ressemble à ceci:
L'URL signée a une date d'expiration et une signature longue. La documentation de la ligne de commande gsutil signurl -d indique que les URL signées sont temporaires: l'expiration par défaut est d'une heure et l'expiration maximale est de sept jours.
Je vais dénoncer ici que getSignedUrl ne dit jamais que votre URL signée expirera dans une semaine. Le code de documentation a
3-17-2025
comme date d'expiration, ce qui suggère que vous pouvez définir les années d'expiration dans le futur. Mon application a parfaitement fonctionné, puis s'est plantée une semaine plus tard. Le message d'erreur indiquait que les signatures ne correspondaient pas, et non que l'URL de téléchargement avait expiré. J'ai apporté diverses modifications à mon code et tout a fonctionné ... jusqu'à ce que tout se bloque une semaine plus tard. Cela a duré plus d'un mois de frustration.Rendre votre fichier accessible au public
Vous pouvez définir les autorisations sur votre fichier en lecture publique, comme expliqué dans la documentation . Cela peut être fait à partir du navigateur Cloud Storage ou de votre serveur Node. Vous pouvez rendre un fichier public ou un répertoire ou l'ensemble de votre base de données de stockage. Voici le code du nœud:
Le résultat ressemblera à ceci dans votre navigateur Cloud Storage:
Tout le monde peut alors utiliser le chemin standard pour télécharger votre fichier:
Une autre façon de rendre un fichier public est d'utiliser la méthode makePublic () . Je n'ai pas été en mesure de faire fonctionner cela, il est difficile d'obtenir le bon chemin de seau et de fichier.
Une alternative intéressante consiste à utiliser les listes de contrôle d'accès . Vous pouvez rendre un fichier disponible uniquement pour les utilisateurs que vous avez mis sur une liste, ou utiliser
authenticatedRead
pour rendre le fichier disponible à toute personne qui est connectée à partir d'un compte Google. S'il y avait une option "toute personne qui s'est connectée à mon application en utilisant Firebase Auth", je l'utiliserais, car cela limiterait l'accès à mes utilisateurs uniquement.Créez votre propre URL de téléchargement avec firebaseStorageDownloadTokens
Plusieurs réponses décrivent une propriété d'objet Google Storage non documentée
firebaseStorageDownloadTokens
. Avec cela, vous pouvez indiquer à Storage le jeton que vous souhaitez utiliser. Vous pouvez générer un jeton avec leuuid
module Node. Quatre lignes de code et vous pouvez créer votre propre URL de téléchargement, la même URL de téléchargement que vous obtenez depuis la console ougetDownloadURL()
. Les quatre lignes de code sont:Voici le code en contexte:
Ce n'est pas une faute de frappe - vous devez imbriquer
firebaseStorageDownloadTokens
en double couche demetadata:
!Doug Stevenson a souligné qu'il
firebaseStorageDownloadTokens
ne s'agissait pas d'une fonctionnalité officielle de Google Cloud Storage. Vous ne le trouverez dans aucune documentation Google et il n'y a aucune promesse qu'il le sera dans la future version de@google-cloud
. J'aimefirebaseStorageDownloadTokens
parce que c'est le seul moyen d'obtenir ce que je veux, mais il a une "odeur" qui n'est pas sûre à utiliser.Pourquoi pas getDownloadURL () de Node?
Comme @Clinton l'a écrit, Google devrait créer une
file.getDownloadURL()
méthode dans@google-cloud/storage
(c'est- à -dire, votre back-end Node). Je souhaite importer un fichier depuis Google Cloud Functions et obtenir l'URL de téléchargement du jeton.la source
@google-cloud/storage
pour cela, n'hésitez pas à le +1;) github.com/googleapis/nodejs-storage/issues/697firebaseStorageDownloadTokens
cela ne fonctionne plus.Avec les changements récents dans la réponse de l' objet des fonctions, vous pouvez obtenir tout ce dont vous avez besoin pour "assembler" l'URL de téléchargement comme suit:
la source
bucket.file().upload()
? Je ne reçois aucune propriété de métadonnées dans les données de réponse et je ne sais pas comment les obtenirfirebaseStorageDownloadTokens
.bucket.name
, vous n'avez pas à le coder en dur ou à utiliser un var local supplémentairemetadata.mediaLink
propriété empêche un tel problème.Si vous travaillez sur un projet Firebase, vous pouvez créer des URL signées dans une fonction cloud sans inclure d'autres bibliothèques ou télécharger un fichier d'informations d'identification. Il vous suffit d'activer l'API IAM et d'ajouter un rôle à votre compte de service existant (voir ci-dessous).
Initialisez la bibliothèque d'administration et obtenez une référence de fichier comme vous le feriez normalement:
Vous générez ensuite une URL signée avec
Assurez-vous que votre compte de service Firebase dispose des autorisations suffisantes pour l'exécuter
Avec une configuration Firebase vanilla, la première fois que vous exécutez le code ci-dessus, vous obtiendrez une erreur L'API de gestion des identités et des accès (IAM) n'a pas été utilisée dans le projet XXXXXX auparavant ou elle est désactivée. . Si vous suivez le lien dans le message d'erreur et activez l'API IAM, vous obtiendrez une autre erreur: Permission iam.serviceAccounts.signBlob est nécessaire pour effectuer cette opération sur le compte de service my-service-account . L'ajout du rôle de créateur de jetons résout ce deuxième problème d'autorisation.
la source
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 à assembler l'URL de téléchargement moi-même en suivant la structure utilisée par Firebase pour générer ces URL, par exemple:Je ne sais pas à quel point utiliser cette méthode est «sûre» (étant donné que Firebase pourrait changer la façon dont il génère les URL de téléchargement à l'avenir) mais elle est facile à mettre en œuvre.
la source
Pour ceux qui se demandent où doit aller le fichier serviceAccountKey.json du SDK Admin Firebase. Placez-le simplement dans le dossier des fonctions et déployez-le comme d'habitude.
Je ne sais toujours pas pourquoi nous ne pouvons pas simplement obtenir l'URL de téléchargement à partir des métadonnées comme nous le faisons dans le SDK Javascript. Il n'est pas souhaitable de générer une URL qui expirera éventuellement et de l'enregistrer dans la base de données.
la source
Je suggère d'utiliser l'option
predefinedAcl: 'publicRead'
lors du téléchargement d'un fichier avec Cloud Storage NodeJS 1.6.x ou +:Ensuite, obtenir l'URL publique est aussi simple que:
la source
Désolé, mais je ne peux pas publier de commentaire sur votre question ci-dessus en raison d'une réputation manquante, je vais donc l'inclure dans cette réponse.
Faites comme indiqué ci-dessus en générant une URL signée, mais au lieu d'utiliser le service-account.json, je pense que vous devez utiliser le serviceAccountKey.json que vous pouvez générer à (remplacez YOURPROJECTID en conséquence)
https://console.firebase.google.com/project/YOURPROJECTID/settings/serviceaccounts/adminsdk
Exemple:
la source
Je ne peux pas commenter la réponse de James Daniels, mais je pense que c'est très important à lire.
Donner une URL signée comme il l'a fait semble dans de nombreux cas assez mauvais et possible dangereux . Selon la documentation de Firebase, l'URL signée expire après un certain temps, donc l'ajouter à votre base de données conduira à une URL vide après un certain délai.
Il se peut que la documentation y soit mal comprise et que l'URL signée n'expire pas, ce qui entraînerait des problèmes de sécurité. La clé semble être la même pour chaque fichier téléchargé. Cela signifie qu'une fois que vous avez obtenu l'URL d'un fichier, quelqu'un peut facilement accéder aux fichiers auxquels il n'est pas censé accéder, simplement en connaissant leurs noms.
Si je n'ai pas compris cela, je voudrais être corrigé. Sinon, quelqu'un devrait probablement mettre à jour la solution nommée ci-dessus. Si je peux me tromper
la source
C'est ce que j'utilise actuellement, c'est simple et cela fonctionne parfaitement.
Vous n'avez rien à faire avec Google Cloud. Cela fonctionne directement avec Firebase.
EDIT: même exemple, mais avec téléchargement:
mettre à jour:
pas besoin de faire deux appels différents dans la méthode de téléchargement pour obtenir les métadonnées:
la source
J'ai eu le même problème, cependant, je regardais le code de l'exemple de fonction firebase au lieu du README. Et les réponses sur ce fil n'ont pas aidé non plus ...
Vous pouvez éviter de transmettre le fichier de configuration en procédant comme suit:
source: fonction de génération automatique de vignettes README
Votre rôle pour le moteur d'application devrait ressembler à ceci:
la source
Si vous utilisez la valeur de listes de contrôle d'accès prédéfinie de 'publicRead', vous pouvez télécharger le fichier et y accéder avec une structure d'URL très simple:
Vous pouvez ensuite construire l'url comme ceci:
la source
Cela fonctionne si vous avez juste besoin d'un fichier public avec une URL simple. Notez que cela peut remplacer vos règles de stockage Firebase.
la source
Pour ceux qui utilisent le SDK Firebase et
admin.initializeApp
:1 - Générez une clé privée et placez-la dans le dossier / functions.
2 - Configurez votre code comme suit:
Documentation
Le try / catch est dû au fait que j'utilise un index.js qui importe d'autres fichiers et crée une fonction pour chaque fichier. Si vous utilisez un seul fichier index.js avec toutes les fonctions, vous devriez être d'accord avec
admin.initializeApp(Object.assign(functions.config().firebase, { credential: admin.credential.cert(serviceAccount) }));
.la source
Depuis Firebase 6.0.0, j'ai pu accéder au stockage directement avec l'administrateur comme ceci:
Je n'ai donc pas eu besoin d'ajouter un compte de service. Ensuite, la définition de l'UUID comme indiqué ci-dessus a fonctionné pour obtenir l'URL de la base de feu.
la source
C'est le meilleur que je connaisse. C'est redondant, mais c'est la seule solution raisonnable qui a fonctionné pour moi.
la source
Sans
signedURL()
utilisermakePublic()
la source
réponse par https://stackoverflow.com/users/269447/laurent fonctionne mieux
la source
Si vous obtenez une erreur:
essaye ça:
la source
Je poste déjà mes ans ... dans l'URL ci-dessous Où vous pouvez obtenir le code complet avec la solution
Comment importer une image (chaîne) encodée en base64 directement dans un bucket Google Cloud Storage à l'aide de Node.js?
la source