Облачное хранилище Google `prefinedAcl` и` file.makePublic () `не работает - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь получить постоянные URL-адреса для загрузки при загрузке файлов в Firebase Storage (Google Cloud Storage) из Firebase Cloud Functions (Google Cloud Functions).

Я попытался установить predefinedAcl в authenticatedReadи до publicRead.Обе привели к 403 (Forbidden) ошибкам, когда мое приложение пыталось загрузить файлы.Это из документации для CreateWriteStreamOptions .Вот код:

const {Storage} = require('@google-cloud/storage');
const storage = new Storage({ projectId: 'languagetwo-cd94d' });
const myBucket = storage.bucket('languagetwo-cd94d.appspot.com');

var mp3Promise = new Promise(function(resolve, reject) {
      let options = {
        metadata: {
          contentType: 'audio/mp3',
          public: true
        }
      };

      synthesizeParams.accept = 'audio/mp3';
      var file = myBucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3');
      textToSpeech.synthesize(synthesizeParams)
      .then(function(audio) {
        audio.pipe(file.createWriteStream(options));
      })
      .then(function() {
        resolve('http://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3');
      })
      .catch(error => console.error(error));
    });

Этот код выполняется без ошибок, записывает файл в хранилище и передает URL-адрес загрузки следующей функции.Когда я пытаюсь загрузить файл с этим URL:

http://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-Allison-Female-IBM/catbirds.mp3

я получаю эту ошибку:

<Error>
<Code>AccessDenied</Code>
<Message>Access denied.</Message>
<Details>
Anonymous caller does not have storage.objects.get access to languagetwo-cd94d.appspot.com/Audio/English/United_States-Allison-Female-IBM/catbirds.mp3.
</Details>
</Error>

При загрузке файла из моего приложения (как авторизованный пользователь) я получаю 403 (Forbidden) сообщение об ошибке.

Я также пробовал это свойство, с тем же результатом:

let options = {
        metadata: {
          contentType: 'audio/webm',
          predefinedAcl: 'publicRead'
        }
      };

Двигаясь дальше, я пытался file.makePublic():

const {Storage} = require('@google-cloud/storage');
const storage = new Storage({ projectId: 'languagetwo-cd94d' });
const myBucket = storage.bucket('languagetwo-cd94d.appspot.com');

var mp3Promise = new Promise(function(resolve, reject) {
      let options = {
        metadata: {
          contentType: 'audio/mp3'
        }
      };

      synthesizeParams.accept = 'audio/mp3';
      var file = myBucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3');
      textToSpeech.synthesize(synthesizeParams)
      .then(function(audio) {
        audio.pipe(file.createWriteStream(options));
      })
      .then(function() {
        file.makePublic()
        .then(function(data) {
          console.log(data)
          resolve('http://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3');
        })
        .catch(error => console.error(error));
      })
      .catch(error => console.error(error));
    });

Этот код даже не выполнялся.Это произошло при file.makePublic(), и сообщение об ошибке было

{ Error: No such object: languagetwo-cd94d.appspot.com/Audio/English/United_States-Allison-Female-IBM/warblers.mp3

Я не уверен, что означает эта ошибка.Я предполагаю, что file.createWriteStream() записал в местоположение файла, а затем file.makePublic() не смог найти это местоположение файла.

Я нашел разрешения для warblers.mp3 в браузере облачного хранилища:

enter image description here

1 Ответ

1 голос
/ 03 мая 2019

первая ошибка связана с правами доступа к корзине, по ссылке вы можете найти инструкции по Identity and Access Management (IAM) [1], там вы можете проверить роли и разрешение на управление доступом к корзине.

Вторая ошибка может быть следствием первой.

Пожалуйста, дайте мне знать, если информация работает для вас.

[1] https://cloud.google.com/storage/docs/access-control/iam

...