После загрузки файла в хранилище Firebase с функциями для Firebase я хотел бы получить URL-адрес загрузки файла.
У меня есть это :
...
return bucket
.upload(fromFilePath, {destination: toFilePath})
.then((err, file) => {
// Get the download url of file
});
В объектном файле много параметров. Даже по имени mediaLink
. Однако, если я попытаюсь получить доступ к этой ссылке, я получаю такую ошибку:
Анонимные пользователи не имеют доступа к объекту storage.objects.get ...
Может кто-нибудь сказать мне, как получить общедоступный URL для загрузки?
Спасибо
Ответы:
Вам нужно будет сгенерировать подписанный URL-адрес с помощью getSignedURL через модуль NPM @ google-cloud / storage .
Пример:
Вам потребуется выполнить инициализацию
@google-cloud/storage
с использованием учетных данных учетной записи службы, поскольку учетных данных приложения по умолчанию будет недостаточно.ОБНОВЛЕНИЕ : к SDK облачного хранилища теперь можно получить доступ через SDK администратора Firebase, который действует как оболочка для @ google-cloud / storage. Единственный способ - это если вы:
источник
action
иexpires
?Вот пример того, как указать токен загрузки при загрузке:
затем позвони с
Ключевым моментом здесь является наличие
metadata
объекта, вложенного вmetadata
свойство option. Установка значенияfirebaseStorageDownloadTokens
uuid-v4 укажет облачному хранилищу использовать его в качестве общедоступного токена аутентификации.Большое спасибо @martemorfosis
источник
В этом ответе будут обобщены варианты получения URL-адреса загрузки при загрузке файла в Google / Firebase Cloud Storage. Существует три типа URL-адресов для загрузки:
Есть три способа получить URL для загрузки токена. Два других URL-адреса загрузки имеют только один способ получить их.
Из консоли Firebase Storage
Вы можете получить URL-адрес загрузки из консоли Firebase Storage:
URL загрузки выглядит так:
Первая часть - это стандартный путь к вашему файлу. В конце жетон. Этот URL-адрес загрузки является постоянным, т. Е. Срок его действия не истекает, хотя вы можете его отозвать.
getDownloadURL () из внешнего интерфейса
Документация говорит нам использовать
getDownloadURL()
:Он получает тот же URL-адрес загрузки, который вы можете получить в консоли Firebase Storage. Этот метод прост, но требует, чтобы вы знали путь к вашему файлу, который в моем приложении составляет около 300 строк кода для относительно простой структуры базы данных. Если ваша база данных сложна, это будет кошмар. И вы можете загружать файлы из внешнего интерфейса, но это сделает ваши учетные данные доступными для всех, кто скачивает ваше приложение. Таким образом, для большинства проектов вы захотите загрузить файлы из серверной части Node или из облачных функций Google, а затем получить URL-адрес загрузки и сохранить его в своей базе данных вместе с другими данными о вашем файле.
getSignedUrl () для временных URL-адресов загрузки
getSignedUrl () легко использовать из серверной части Node или из облачных функций Google:
Подписанный URL-адрес загрузки выглядит так:
Подписанный URL-адрес имеет срок действия и длинную подпись. В документации к командной строке gsutil signurl -d говорится, что подписанные URL-адреса являются временными: срок действия по умолчанию составляет один час, а максимальный срок действия - семь дней.
Я собираюсь разглагольствовать здесь, что getSignedUrl никогда не говорит, что срок действия вашего подписанного URL истечет через неделю. В коде документации
3-17-2025
указана дата истечения срока действия, что означает, что вы можете установить годы истечения срока действия в будущем. Мое приложение работало отлично, а через неделю вылетело. В сообщении об ошибке говорилось, что подписи не совпадают, а не о том, что срок действия URL-адреса загрузки истек. Я внес различные изменения в свой код, и все работало ... пока через неделю все не рухнуло. Это продолжалось более месяца разочарования.Сделайте свой файл общедоступным
Вы можете установить разрешения для публичного чтения вашего файла, как описано в документации . Это можно сделать из браузера облачного хранилища или с вашего сервера Node. Вы можете сделать один файл общедоступным, каталог или всю базу данных Storage. Вот код узла:
Результат будет выглядеть так в вашем браузере облачного хранилища:
После этого любой желающий может использовать стандартный путь для загрузки вашего файла:
Другой способ сделать файл общедоступным - использовать метод makePublic () . Мне не удалось заставить это работать, сложно определить правильные пути к ведру и файлам.
Интересной альтернативой является использование списков контроля доступа . Вы можете сделать файл доступным только для пользователей, которых вы включили в список, или использовать его,
authenticatedRead
чтобы сделать файл доступным для всех, кто вошел в систему из учетной записи Google. Если бы существовала опция «любой, кто вошел в мое приложение с помощью Firebase Auth», я бы использовал ее, поскольку это ограничило бы доступ только для моих пользователей.Создайте свой собственный URL-адрес загрузки с помощью firebaseStorageDownloadTokens
В нескольких ответах описывается недокументированное свойство объекта Google Storage
firebaseStorageDownloadTokens
. С его помощью вы можете указать Storage токен, который хотите использовать. Вы можете сгенерировать токен с помощьюuuid
модуля Node. Четыре строки кода, и вы можете создать свой собственный URL-адрес загрузки, тот же URL-адрес загрузки, который вы получаете из консоли илиgetDownloadURL()
. Четыре строки кода:Вот код в контексте:
Это не опечатка - гнездо нужно
firebaseStorageDownloadTokens
в два слояmetadata:
!Дуг Стивенсон отметил, что
firebaseStorageDownloadTokens
это не официальная функция Google Cloud Storage. Вы не найдете его ни в одной документации Google, и нет никаких обещаний, что он будет в будущей версии@google-cloud
. Мне нравится,firebaseStorageDownloadTokens
потому что это единственный способ получить то, что я хочу, но он имеет "запах", который небезопасно использовать.Почему нет getDownloadURL () из узла?
Как написал @Clinton, Google должен создать
file.getDownloadURL()
метод в@google-cloud/storage
(то есть в вашем сервере Node). Я хочу загрузить файл из Google Cloud Functions и получить URL для загрузки токена.источник
@google-cloud/storage
для этого, не стесняйтесь +1;) github.com/googleapis/nodejs-storage/issues/697firebaseStorageDownloadTokens
больше не работает.Благодаря недавним изменениям в ответе объекта функций вы можете получить все необходимое для «сшивания» URL-адреса загрузки следующим образом:
источник
bucket.file().upload()
? Я не получаю никаких свойств метаданных в данных ответа и не знаю, как их получитьfirebaseStorageDownloadTokens
.bucket.name
, вам не нужно жестко его кодировать или использовать дополнительную локальнуюmetadata.mediaLink
свойства предотвращает такую проблему.Если вы работаете над проектом Firebase, вы можете создавать подписанные URL-адреса в облачной функции без включения других библиотек или загрузки файла учетных данных. Вам просто нужно включить IAM API и добавить роль в существующую учетную запись службы (см. Ниже).
Инициализируйте библиотеку администратора и получите ссылку на файл, как обычно:
Затем вы создаете подписанный URL-адрес с помощью
Убедитесь, что у вашей учетной записи службы Firebase достаточно прав для запуска этого
С ванильной конфигурацией Firebase при первом запуске вышеуказанного кода вы получите сообщение об ошибке. API управления идентификацией и доступом (IAM) ранее не использовался в проекте XXXXXX или отключен. . Если вы перейдете по ссылке в сообщении об ошибке и включите IAM API, вы получите еще одну ошибку: Разрешение iam.serviceAccounts.signBlob требуется для выполнения этой операции в сервисной учетной записи my-service-account . Добавление роли Token Creator устраняет эту вторую проблему с разрешениями.
источник
Один из методов, который я успешно использую, - установить значение UUID v4 для ключа, указанного
firebaseStorageDownloadTokens
в метаданных файла, после того, как он завершит загрузку, а затем самостоятельно собрать URL-адрес загрузки, следуя структуре, которую Firebase использует для создания этих URL-адресов, например:Я не знаю, насколько «безопасным» является использование этого метода (учитывая, что Firebase может изменить способ создания URL-адресов для загрузки в будущем), но его легко реализовать.
источник
Для тех, кто задается вопросом, куда должен идти файл serviceAccountKey.json из Firebase Admin SDK. Просто поместите его в папку функций и разверните как обычно.
Меня все еще сбивает с толку, почему мы не можем просто получить URL-адрес загрузки из метаданных, как мы это делаем в Javascript SDK. Создание URL-адреса, срок действия которого в конечном итоге истечет, и сохранение его в базе данных нежелательно.
источник
Вам следует избегать кодирования префикса URL в вашем коде . Я предлагаю использовать опцию
predefinedAcl: 'publicRead'
при загрузке файла с помощью Cloud Storage NodeJS 1.6.x или +:Тогда получить общедоступный URL так же просто:
источник
Извините, но я не могу опубликовать комментарий к вашему вопросу выше из-за отсутствия репутации, поэтому я включу его в этот ответ.
Сделайте, как указано выше, создав подписанный URL-адрес, но вместо использования service-account.json, я думаю, вам нужно использовать serviceAccountKey.json, который вы можете сгенерировать в (замените YOURPROJECTID соответственно)
https://console.firebase.google.com/project/YOURPROJECTID/settings/serviceaccounts/adminsdk
Пример:
источник
Я не могу комментировать ответ Джеймса Дэниэлса, но я думаю, что это очень важно прочитать.
Предоставление подписанного URL-адреса, как и он, во многих случаях кажется довольно плохим и, возможно, опасным . Согласно документации Firebase подписанный URL-адрес истекает через некоторое время, поэтому добавление этого в вашу базу данных приведет к пустому URL-адресу через определенный период времени.
Возможно, вы неправильно поняли документацию и подписанный URL-адрес не истекает, что в результате может вызвать некоторые проблемы с безопасностью. Ключ кажется одинаковым для всех загруженных файлов. Это означает, что как только вы получите URL-адрес одного файла, кто-то сможет легко получить доступ к файлам, к которым он не имеет доступа, просто зная их имена.
Если я неправильно это понял, то меня поправят. Еще кто-то, вероятно, должен обновить вышеуказанное решение. Если я могу ошибаться
источник
Это то, что я использую сейчас, это просто и работает безупречно.
Вам не нужно ничего делать с Google Cloud. Он работает "из коробки" с Firebase ..
РЕДАКТИРОВАТЬ: тот же пример, но с загрузкой:
#update: нет необходимости выполнять два разных вызова метода загрузки для получения метаданных:
источник
Если вы используете предопределенное значение списков управления доступом publicRead, вы можете загрузить файл и получить к нему доступ с очень простой структурой URL:
Затем вы можете создать URL-адрес следующим образом:
источник
У меня была такая же проблема, однако я смотрел код примера функции firebase вместо README. И ответы в этой теме тоже не помогли ...
Вы можете избежать передачи файла конфигурации, выполнив следующие действия:
источник: функция автоматического создания эскизов README
Ваша роль в движке приложения должна выглядеть так:
источник
Это работает, если вам просто нужен общедоступный файл с простым URL-адресом. Обратите внимание, что это может отменить ваши правила хранения Firebase.
источник
Для тех, кто использует Firebase SDK и
admin.initializeApp
:1 - Создайте закрытый ключ и поместите его в папку / functions.
2 - Настройте свой код следующим образом:
Документация
Попытка / уловка заключается в том, что я использую index.js, который импортирует другие файлы и создает по одной функции для каждого файла. Если вы используете один файл index.js со всеми функциями, все должно быть в порядке
admin.initializeApp(Object.assign(functions.config().firebase, { credential: admin.credential.cert(serviceAccount) }));
.источник
Начиная с firebase 6.0.0 я мог получить доступ к хранилищу напрямую с помощью администратора следующим образом:
Так что мне не нужно было добавлять учетную запись службы. Затем установка UUID, как указано выше, сработала для получения URL-адреса firebase.
источник
Это лучшее, что я придумал. Это избыточное, но единственное разумное решение, которое сработало для меня.
источник
Без
signedURL()
использованияmakePublic()
источник
ответ https://stackoverflow.com/users/269447/laurent работает лучше всего
источник
Если вы получаете сообщение об ошибке:
попробуй это:
источник
Я уже публикую свой ответ ... в URL-адресе ниже, где вы можете получить полный код с решением
Как загрузить изображение (строку) в кодировке base64 непосредственно в корзину Google Cloud Storage с помощью Node.js?
источник