В этом ответе приведены варианты получения URL-адреса загрузки при загрузке файла в облачное хранилище Google/Firebase. Существует три типа URL-адресов загрузки:
.
- подписанные URL-адреса загрузки, которые являются временными и имеют функции безопасности
- URL-адреса для загрузки токенов, которые являются постоянными и имеют функции безопасности
- общедоступные URL-адреса для скачивания, которые являются постоянными и не защищенными
Есть три способа получить URL-адрес загрузки токена. Два других URL загрузки доступны только одним способом.
.
Из консоли Firebase Storage
Вы можете получить URL-адрес загрузки из консоли Firebase Storage:

URL для скачивания выглядит следующим образом:
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
Первая часть — это стандартный путь к вашему файлу. В конце жетон. Этот URL-адрес загрузки является постоянным, т. е. срок его действия не ограничен, хотя вы можете отозвать его.
getDownloadURL() из внешнего интерфейса
документация говорит нам использовать getDownloadURL()
:
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
Это тот же URL-адрес загрузки, который вы можете получить из консоли Firebase Storage. Этот метод прост, но требует, чтобы вы знали путь к вашему файлу, который в моем приложении составляет около 300 строк кода, для относительно простой структуры базы данных. Если ваша база данных сложна, это будет кошмаром. И вы можете загружать файлы из внешнего интерфейса, но это откроет ваши учетные данные любому, кто загрузит ваше приложение. Поэтому для большинства проектов вам потребуется загружать файлы из серверной части Node или из Google Cloud Functions, а затем получать URL-адрес загрузки и сохранять его в своей базе данных вместе с другими данными о вашем файле.
getSignedUrl() для URL временной загрузки
getSignedUrl() легко использовать из серверной части узла или функций Google Cloud:
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);
}
});
});
});
});
}
Подписанный URL-адрес загрузки выглядит следующим образом:
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
Подписанный URL-адрес имеет срок действия и длинную подпись. В документации по командной строке gsutil signurl -d говорится, что подписанные URL-адреса являются временными: срок действия по умолчанию составляет один час, а максимальный срок действия — семь дней.
Я собираюсь разглагольствовать здесь о том, что getSignedUrl никогда не говорит, что срок действия вашего подписанного URL истечет через неделю. Код документации имеет 3-17-2025
в качестве даты истечения срока действия, что предполагает, что вы можете установить годы истечения срока действия в будущем. Мое приложение работало отлично, а через неделю рухнуло. В сообщении об ошибке говорилось, что подписи не совпадают, а не срок действия URL-адреса загрузки. Я внес различные изменения в свой код, и все работало... пока через неделю все не рухнуло. Это продолжалось больше месяца разочарования.
Сделать файл общедоступным
Вы можете установить права доступа к файлу для общего чтения, как описано в документации. Это можно сделать из браузера облачного хранилища или с вашего сервера Node. Вы можете сделать общедоступным один файл, каталог или всю базу данных Storage. Вот код узла:
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));
});
Результат в браузере облачного хранилища будет выглядеть следующим образом:

Затем любой может использовать стандартный путь для загрузки вашего файла:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
Другой способ сделать файл общедоступным — использовать метод makePublic(). Мне не удалось заставить это работать, сложно правильно указать путь к корзине и файлам.
Интересной альтернативой является использование списков контроля доступа. Вы можете сделать файл доступным только для пользователей, внесенных в список, или использовать authenticatedRead
, чтобы сделать файл доступным для всех, кто вошел в систему из учетной записи Google. Если бы была опция «любой, кто вошел в мое приложение с помощью аутентификации Firebase», я бы использовал ее, так как это ограничило бы доступ только для моих пользователей.
Создайте собственный URL-адрес загрузки с помощью firebaseStorageDownloadTokens
В нескольких ответах описывается недокументированное свойство объекта Google Storage firebaseStorageDownloadTokens
. При этом вы можете указать Storage токен, который хотите использовать. Вы можете сгенерировать токен с помощью модуля Node uuid
. Четыре строки кода, и вы можете создать свой собственный URL-адрес загрузки, тот же URL-адрес загрузки, который вы получаете из консоли, или getDownloadURL()
. Четыре строки кода:
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);
Вот код в контексте:
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));
});
Это не опечатка — вы должны вложить firebaseStorageDownloadTokens
в два слоя metadata:
!
Дуг Стивенсон отметил, что firebaseStorageDownloadTokens
не является официальной функцией Google Cloud Storage. Вы не найдете его ни в одной документации Google, и никто не обещает, что он будет в будущей версии @google-cloud
. Мне нравится firebaseStorageDownloadTokens
, потому что это единственный способ получить то, что я хочу, но у него есть "запах", который небезопасен в использовании.
Почему нет getDownloadURL() с узла?
Как писал @Clinton, Google должен сделать метод file.getDownloadURL()
в @google-cloud/storage
(т. е. серверной части Node). Я хочу загрузить файл из Google Cloud Functions и получить URL-адрес загрузки токена.
См. также этот пост, который восстанавливает URL-адрес из данных, доступных в функции.
только если у вас нет правил безопасности firebase, то есть: разрешить чтение и запись при любых условиях, тогда этого шаблона будет достаточно "firebasestorage.googleapis.com/v0/b/… name>?alt=media"
подписанный URL-адрес или токен требуется только в том случае, если у вас нет разрешения на чтение и запись, если auth имеет значение null