Nach dem Hochladen einer Datei in Firebase Storage mit Funktionen für Firebase möchte ich die Download-URL der Datei erhalten.
Ich habe das :
...
return bucket
.upload(fromFilePath, {destination: toFilePath})
.then((err, file) => {
// Get the download url of file
});
Die Objektdatei enthält viele Parameter. Sogar einer mit Namen mediaLink
. Wenn ich jedoch versuche, auf diesen Link zuzugreifen, wird folgende Fehlermeldung angezeigt:
Anonyme Benutzer haben keinen Zugriff auf storage.objects.get auf Objekt ...
Kann mir jemand sagen, wie ich die öffentliche Download-URL bekomme?
Danke dir
Antworten:
Sie müssen eine signierte URL mit getSignedURL über das NPM-Modul @ google-cloud / storage generieren .
Beispiel:
Sie müssen
@google-cloud/storage
mit den Anmeldeinformationen Ihres Dienstkontos initialisieren, da die Standardanmeldeinformationen der Anwendung nicht ausreichen.UPDATE : Auf das Cloud Storage SDK kann jetzt über das Firebase Admin SDK zugegriffen werden, das als Wrapper für @ google-cloud / storage fungiert. Der einzige Weg ist, wenn Sie entweder:
quelle
action
undexpires
?Hier ist ein Beispiel zum Festlegen des Download-Tokens beim Hochladen:
dann mit anrufen
Der Schlüssel hier ist, dass
metadata
in dermetadata
Optionseigenschaft ein Objekt verschachtelt ist . Wenn SiefirebaseStorageDownloadTokens
einen uuid-v4-Wert festlegen, wird Cloud Storage angewiesen, diesen Wert als öffentliches Authentifizierungstoken zu verwenden.Vielen Dank an @martemorfosis
quelle
In dieser Antwort werden die Optionen zum Abrufen der Download-URL beim Hochladen einer Datei in Google / Firebase Cloud Storage zusammengefasst. Es gibt drei Arten von Download-URLs:
Es gibt drei Möglichkeiten, eine Token-Download-URL abzurufen. Die beiden anderen Download-URLs haben nur eine Möglichkeit, sie abzurufen.
Von der Firebase-Speicherkonsole
Sie können die Download-URL von der Firebase-Speicherkonsole abrufen:
Die Download-URL sieht folgendermaßen aus:
Der erste Teil ist ein Standardpfad zu Ihrer Datei. Am Ende steht der Token. Diese Download-URL ist permanent, dh sie läuft nicht ab, obwohl Sie sie widerrufen können.
getDownloadURL () Vom Frontend
Die Dokumentation fordert uns auf, Folgendes zu verwenden
getDownloadURL()
:Dadurch wird dieselbe Download-URL abgerufen, die Sie von Ihrer Firebase-Speicherkonsole erhalten können. Diese Methode ist einfach, erfordert jedoch, dass Sie den Pfad zu Ihrer Datei kennen, der in meiner App etwa 300 Codezeilen umfasst, um eine relativ einfache Datenbankstruktur zu erhalten. Wenn Ihre Datenbank komplex ist, wäre dies ein Albtraum. Sie könnten Dateien vom Front-End hochladen, aber dies würde Ihre Anmeldeinformationen jedem zugänglich machen, der Ihre App herunterlädt. Bei den meisten Projekten möchten Sie Ihre Dateien von Ihrem Node-Backend oder von Google Cloud-Funktionen hochladen, dann die Download-URL abrufen und zusammen mit anderen Daten zu Ihrer Datei in Ihrer Datenbank speichern.
getSignedUrl () für temporäre Download-URLs
getSignedUrl () ist einfach über ein Node- Backend oder Google Cloud-Funktionen zu verwenden:
Eine signierte Download-URL sieht folgendermaßen aus:
Die signierte URL hat ein Ablaufdatum und eine lange Signatur. Die Dokumentation für die Befehlszeile gsutil signurl -d besagt, dass signierte URLs nur vorübergehend sind: Der Standardablauf beträgt eine Stunde und der maximale Ablauf sieben Tage.
Ich werde hier schimpfen, dass getSignedUrl niemals sagt, dass Ihre signierte URL in einer Woche abläuft. Der Dokumentationscode hat
3-17-2025
das Ablaufdatum, was darauf hindeutet, dass Sie die Ablaufjahre in der Zukunft festlegen können. Meine App funktionierte perfekt und stürzte eine Woche später ab. Die Fehlermeldung besagte, dass die Signaturen nicht übereinstimmten und die Download-URL nicht abgelaufen war. Ich habe verschiedene Änderungen an meinem Code vorgenommen und alles hat funktioniert ... bis eine Woche später alles abstürzte. Dies dauerte mehr als einen Monat der Frustration.Machen Sie Ihre Datei öffentlich verfügbar
Sie können die Berechtigungen für Ihre Datei so festlegen, dass sie öffentlich gelesen werden können, wie in der Dokumentation erläutert . Dies kann über den Cloud-Speicherbrowser oder von Ihrem Knotenserver aus erfolgen. Sie können eine Datei oder ein Verzeichnis oder Ihre gesamte Speicherdatenbank öffentlich machen. Hier ist der Knotencode:
Das Ergebnis sieht in Ihrem Cloud-Speicherbrowser folgendermaßen aus:
Jeder kann dann den Standardpfad verwenden, um Ihre Datei herunterzuladen:
Eine andere Möglichkeit, eine Datei öffentlich zu machen, ist die Verwendung der Methode makePublic () . Ich habe es nicht geschafft, dies zum Laufen zu bringen. Es ist schwierig, die richtigen Bucket- und Dateipfade zu finden.
Eine interessante Alternative ist die Verwendung von Zugriffssteuerungslisten . Sie können eine Datei nur Benutzern zur Verfügung stellen, die Sie in eine Liste aufgenommen haben, oder sie verwenden
authenticatedRead
, um die Datei allen Benutzern zur Verfügung zu stellen, die über ein Google-Konto angemeldet sind. Wenn es eine Option "Jeder, der sich mit Firebase Auth bei meiner App angemeldet hat" gäbe, würde ich diese verwenden, da dies den Zugriff nur auf meine Benutzer beschränken würde.Erstellen Sie Ihre eigene Download-URL mit firebaseStorageDownloadTokens
Mehrere Antworten beschreiben eine undokumentierte Google Storage-Objekteigenschaft
firebaseStorageDownloadTokens
. Damit können Sie Storage das Token mitteilen, das Sie verwenden möchten. Sie können mit demuuid
Knotenmodul ein Token generieren . Vier Codezeilen und Sie können Ihre eigene Download-URL erstellen, dieselbe Download-URL, die Sie von der Konsole oder erhaltengetDownloadURL()
. Die vier Codezeilen sind:Hier ist der Code im Kontext:
Das ist kein Tippfehler - Sie müssen
firebaseStorageDownloadTokens
in doppelten Schichten von nistenmetadata:
!Doug Stevenson wies darauf hin, dass dies
firebaseStorageDownloadTokens
keine offizielle Google Cloud Storage-Funktion ist. Sie werden es in keiner Google-Dokumentation finden, und es gibt kein Versprechen, dass es in einer zukünftigen Version von sein wird@google-cloud
. Ich mag es,firebaseStorageDownloadTokens
weil es der einzige Weg ist, das zu bekommen, was ich will, aber es hat einen "Geruch", dessen Verwendung nicht sicher ist.Warum kein getDownloadURL () vom Knoten?
Wie @Clinton schrieb, sollte Google
file.getDownloadURL()
eine Methode in@google-cloud/storage
(dh Ihrem Node- Backend) erstellen . Ich möchte eine Datei von Google Cloud Functions hochladen und die Token-Download-URL erhalten.quelle
@google-cloud/storage
dafür erstellt, zögern Sie nicht +1;) github.com/googleapis/nodejs-storage/issues/697firebaseStorageDownloadTokens
nicht mehr funktioniert.Mit den jüngsten Änderungen in den Funktionen Objekt Antwort können Sie alles , was Sie brauchen , um „Stich“ zusammen die Download - URL wie so erhalten:
quelle
bucket.file().upload()
? Ich erhalte keine Metadateneigenschaft in den Antwortdaten und bin mir nicht sicher, wie ich diese erhalten sollfirebaseStorageDownloadTokens
.bucket.name
, Sie müssen es nicht fest codieren oder eine zusätzliche lokalemetadata.mediaLink
Eigenschaft verhindert ein solches Problem.Wenn Sie an einem Firebase-Projekt arbeiten, können Sie signierte URLs in einer Cloud-Funktion erstellen, ohne andere Bibliotheken einzuschließen oder eine Anmeldeinformationsdatei herunterzuladen. Sie müssen nur die IAM-API aktivieren und Ihrem vorhandenen Dienstkonto eine Rolle hinzufügen (siehe unten).
Initialisieren Sie die Admin-Bibliothek und erhalten Sie eine Dateireferenz wie gewohnt:
Anschließend generieren Sie eine signierte URL mit
Stellen Sie sicher, dass Ihr Firebase-Dienstkonto über ausreichende Berechtigungen verfügt, um dies auszuführen
Bei einer Vanilla Firebase-Konfiguration wird beim ersten Ausführen des obigen Codes eine Fehlermeldung angezeigt. Die IAM-API (Identity and Access Management) wurde zuvor in Projekt XXXXXX nicht verwendet oder ist deaktiviert. . Wenn Sie dem Link in der Fehlermeldung folgen und die IAM-API aktivieren, wird ein weiterer Fehler angezeigt : Die Berechtigung iam.serviceAccounts.signBlob ist erforderlich, um diesen Vorgang für das Dienstkonto my-service-account auszuführen . Durch Hinzufügen der Token Creator-Rolle wird dieses zweite Berechtigungsproblem behoben.
quelle
Eine Methode, die ich mit Erfolg verwende, besteht darin, einen UUID v4-Wert auf einen Schlüssel festzulegen, der
firebaseStorageDownloadTokens
in den Metadaten der Datei nach Abschluss des Uploads benannt ist, und dann die Download-URL gemäß der Struktur, die Firebase zum Generieren dieser URLs verwendet, selbst zusammenzustellen, z.Ich weiß nicht, wie viel "sicher" die Verwendung dieser Methode ist (da Firebase in Zukunft die Generierung der Download-URLs ändern könnte), aber sie ist einfach zu implementieren.
quelle
Für diejenigen, die sich fragen, wohin die Firebase Admin SDK-Datei serviceAccountKey.json gehen soll. Legen Sie es einfach in den Funktionsordner und stellen Sie es wie gewohnt bereit.
Es verwirrt mich immer noch, warum wir nicht einfach die Download-URL aus den Metadaten abrufen können, wie wir es im Javascript SDK tun. Es ist nicht wünschenswert, eine URL zu generieren, die irgendwann abläuft, und sie in der Datenbank zu speichern.
quelle
Ich schlage vor, die Option
predefinedAcl: 'publicRead'
beim Hochladen einer Datei mit Cloud Storage NodeJS 1.6.x oder + zu verwenden:Das Abrufen der öffentlichen URL ist dann so einfach wie:
quelle
Entschuldigung, aber ich kann wegen des fehlenden Rufs keinen Kommentar zu Ihrer Frage oben posten, daher werde ich ihn in diese Antwort aufnehmen.
Gehen Sie wie oben angegeben vor, indem Sie eine signierte URL generieren, aber anstatt das service-account.json zu verwenden, müssen Sie meines Erachtens das serviceAccountKey.json verwenden, das Sie unter generieren können (ersetzen Sie YOURPROJECTID entsprechend).
https://console.firebase.google.com/project/YOURPROJECTID/settings/serviceaccounts/adminsdk
Beispiel:
quelle
Ich kann die Antwort von James Daniels nicht kommentieren, aber ich denke, das ist sehr wichtig zu lesen.
Eine signierte URL herauszugeben Wie er es getan hat, scheint in vielen Fällen ziemlich schlecht und möglicherweise gefährlich zu sein . Laut der Dokumentation von Firebase läuft die signierte URL nach einiger Zeit ab. Wenn Sie diese also zu Ihrer Datenbank hinzufügen, wird nach einem bestimmten Zeitraum eine leere URL angezeigt
Es kann sein, dass die Dokumentation dort falsch verstanden wurde und die signierte URL nicht abläuft, was zu Sicherheitsproblemen führen würde. Der Schlüssel scheint für jede hochgeladene Datei gleich zu sein. Dies bedeutet, dass jemand, sobald Sie die URL einer Datei erhalten haben, leicht auf Dateien zugreifen kann, auf die er nicht zugreifen soll, indem er nur deren Namen kennt.
Wenn ich das missverstehen würde, müsste ich korrigiert werden. Andernfalls sollte wahrscheinlich jemand die oben genannte Lösung aktualisieren. Wenn ich mich da irre
quelle
Dies ist, was ich derzeit benutze, es ist einfach und es funktioniert einwandfrei.
Sie müssen mit Google Cloud nichts tun. Mit Firebase funktioniert es sofort.
EDIT: Gleiches Beispiel, aber mit Upload:
aktualisieren:
Es sind keine zwei unterschiedlichen Aufrufe beim Hochladen erforderlich, um die Metadaten abzurufen:
quelle
Ich hatte das gleiche Problem, aber ich habe mir den Code des Firebase-Funktionsbeispiels anstelle der README angesehen. Und Antworten auf diesen Thread haben auch nicht geholfen ...
Sie können das Übergeben der Konfigurationsdatei vermeiden, indem Sie folgende Schritte ausführen:
Quelle: Thumbnails-Funktion README automatisch generieren
Ihre Rolle für die App Engine sollte folgendermaßen aussehen:
quelle
Wenn Sie den vordefinierten Zugriffssteuerungslistenwert 'publicRead' verwenden, können Sie die Datei hochladen und mit einer sehr einfachen URL-Struktur darauf zugreifen:
Sie können die URL dann folgendermaßen erstellen:
quelle
Dies funktioniert, wenn Sie nur eine öffentliche Datei mit einer einfachen URL benötigen. Beachten Sie, dass dies Ihre Firebase-Speicherregeln außer Kraft setzen kann.
quelle
Für diejenigen, die Firebase SDK verwenden und
admin.initializeApp
:1 - Generieren Sie einen privaten Schlüssel und legen Sie ihn im Ordner / functions ab.
2 - Konfigurieren Sie Ihren Code wie folgt:
Dokumentation
Der Versuch / Fang ist, weil ich eine index.js verwende, die andere Dateien importiert und eine Funktion für jede Datei erstellt. Wenn Sie eine einzelne index.js-Datei mit allen Funktionen verwenden, sollten Sie damit einverstanden sein
admin.initializeApp(Object.assign(functions.config().firebase, { credential: admin.credential.cert(serviceAccount) }));
.quelle
Ab Firebase 6.0.0 konnte ich wie folgt direkt mit dem Administrator auf den Speicher zugreifen:
Ich musste also kein Dienstkonto hinzufügen. Das Einstellen der UUID wie oben angegeben hat zum Abrufen der Firebase-URL funktioniert.
quelle
Dies ist das Beste, was ich mir ausgedacht habe. Es ist überflüssig, aber die einzige vernünftige Lösung, die für mich funktioniert hat.
quelle
Ohne zu
signedURL()
benutzenmakePublic()
quelle
Antwort von https://stackoverflow.com/users/269447/laurent funktioniert am besten
quelle
Wenn Sie eine Fehlermeldung erhalten:
Versuche dies:
quelle
Ich poste meine Antwort bereits ... unter der URL, unter der Sie den vollständigen Code mit Lösung erhalten können
Wie lade ich ein Base64-codiertes Bild (Zeichenfolge) mit Node.js direkt in einen Google Cloud Storage-Bucket hoch?
quelle