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:
- signierte Download-URLs, die temporär sind und Sicherheitsfunktionen aufweisen
- Token-Download-URLs, die dauerhaft sind und Sicherheitsfunktionen aufweisen
- öffentliche Download-URLs, die dauerhaft sind und keine Sicherheit bieten
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:
https://firebasestorage.googleapis.com/v0/b/languagetwo-cd94d.appspot.com/o/Audio%2FEnglish%2FUnited_States-OED-0%2Fabout.mp3?alt=media&token=489c48b3-23fb-4270-bd85-0a328d2808e5
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()
:
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").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:
function oedPromise() {
return new Promise(function(resolve, reject) {
http.get(oedAudioURL, function(response) {
response.pipe(file.createWriteStream(options))
.on('error', function(error) {
console.error(error);
reject(error);
})
.on('finish', function() {
file.getSignedUrl(config, function(err, url) {
if (err) {
console.error(err);
return;
} else {
resolve(url);
}
});
});
});
});
}
Eine signierte Download-URL sieht folgendermaßen aus:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio%2FSpanish%2FLatin_America-Sofia-Female-IBM%2Faqu%C3%AD.mp3?GoogleAccessId=languagetwo-cd94d%40appspot.gserviceaccount.com&Expires=4711305600&Signature=WUmABCZIlUp6eg7dKaBFycuO%2Baz5vOGTl29Je%2BNpselq8JSl7%2BIGG1LnCl0AlrHpxVZLxhk0iiqIejj4Qa6pSMx%2FhuBfZLT2Z%2FQhIzEAoyiZFn8xy%2FrhtymjDcpbDKGZYjmWNONFezMgYekNYHi05EPMoHtiUDsP47xHm3XwW9BcbuW6DaWh2UKrCxERy6cJTJ01H9NK1wCUZSMT0%2BUeNpwTvbRwc4aIqSD3UbXSMQlFMxxWbPvf%2B8Q0nEcaAB1qMKwNhw1ofAxSSaJvUdXeLFNVxsjm2V9HX4Y7OIuWwAxtGedLhgSleOP4ErByvGQCZsoO4nljjF97veil62ilaQ%3D%3D
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:
var webmPromise = new Promise(function(resolve, reject) {
var options = {
destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
predefinedAcl: 'publicRead',
contentType: 'audio/' + audioType,
};
synthesizeParams.accept = 'audio/webm';
var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
textToSpeech.synthesize(synthesizeParams)
.then(function(audio) {
audio.pipe(file.createWriteStream(options));
})
.then(function() {
console.log("webm audio file written.");
resolve();
})
.catch(error => console.error(error));
});
Das Ergebnis sieht in Ihrem Cloud-Speicherbrowser folgendermaßen aus:
Jeder kann dann den Standardpfad verwenden, um Ihre Datei herunterzuladen:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
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 dem uuid
Knotenmodul ein Token generieren . Vier Codezeilen und Sie können Ihre eigene Download-URL erstellen, dieselbe Download-URL, die Sie von der Konsole oder erhalten getDownloadURL()
. Die vier Codezeilen sind:
const uuidv4 = require('uuid/v4');
const uuid = uuidv4();
metadata: { firebaseStorageDownloadTokens: uuid }
https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);
Hier ist der Code im Kontext:
var webmPromise = new Promise(function(resolve, reject) {
var options = {
destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
contentType: 'audio/' + audioType,
metadata: {
metadata: {
firebaseStorageDownloadTokens: uuid,
}
}
};
synthesizeParams.accept = 'audio/webm';
var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
textToSpeech.synthesize(synthesizeParams)
.then(function(audio) {
audio.pipe(file.createWriteStream(options));
})
.then(function() {
resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);
})
.catch(error => console.error(error));
});
Das ist kein Tippfehler - Sie müssen firebaseStorageDownloadTokens
in doppelten Schichten von nisten metadata:
!
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.