Я пытаюсь получить постоянные 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
в браузере облачного хранилища: