Bu cevap, Google / Firebase Bulut Depolama'ya bir dosya yüklerken indirme URL'sini alma seçeneklerini özetleyecektir. Üç tür indirme URL'si vardır:
- geçici olan ve güvenlik özelliklerine sahip imzalı indirme URL'leri
- Kalıcı olan ve güvenlik özelliklerine sahip olan simge indirme URL'leri
- kalıcı olan ve güvenliği olmayan genel indirme URL'leri
Belirteç indirme URL'si almanın üç yolu vardır. Diğer iki indirme URL'sinin bunları almanın tek bir yolu vardır.
Firebase Storage Console'dan
İndirme URL'sini Firebase Storage konsolundan alabilirsiniz:
İndirme URL'si şuna benzer:
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
İlk bölüm, dosyanıza giden standart bir yoldur. Sonunda jeton var. Bu indirme URL'si kalıcıdır, yani iptal etmenize rağmen süresi dolmaz.
getDownloadURL () Ön Uçtan
Dokümantasyon kullanımına söyler getDownloadURL()
:
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
Bu, Firebase Storage konsolunuzdan alabileceğiniz indirme URL'sinin aynısını alır. Bu yöntem kolaydır, ancak nispeten basit bir veritabanı yapısı için uygulamamda yaklaşık 300 satır kod olan dosyanızın yolunu bilmenizi gerektirir. Veritabanınız karmaşıksa, bu bir kabus olur. Ve ön uçtan dosyalar yükleyebilirsiniz, ancak bu, kimlik bilgilerinizi uygulamanızı indiren herkese ifşa eder. Dolayısıyla, çoğu proje için dosyalarınızı Node arka ucunuzdan veya Google Cloud Functions'dan yüklemek, ardından indirme URL'sini almak ve dosyanızla ilgili diğer verilerle birlikte veritabanınıza kaydetmek isteyeceksiniz.
Geçici İndirme URL'leri için getSignedUrl ()
getSignedUrl () , bir Node arka ucundan veya Google Cloud Functions'tan kolayca kullanılabilir:
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);
}
});
});
});
});
}
İmzalı bir indirme URL'si şuna benzer:
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
İmzalanmış URL'nin bir son kullanma tarihi ve uzun bir imzası vardır. Gsutil signurl -d komut satırına ilişkin belgeler , imzalı URL'lerin geçici olduğunu belirtir: varsayılan süre sonu bir saattir ve maksimum süre sonu yedi gündür.
Burada getSignedUrl imzalı URL'nizin bir hafta içinde süresinin dolacağını asla söylemediğini söyleyeceğim . Dokümantasyon kodunun 3-17-2025
son kullanma tarihi vardır ve bu, gelecekte sona erme yıllarını ayarlayabileceğinizi gösterir. Uygulamam mükemmel çalıştı ve bir hafta sonra çöktü. Hata mesajı, indirme URL'sinin süresinin dolduğunu değil, imzaların eşleşmediğini söylüyordu. Kodumda çeşitli değişiklikler yaptım ve her şey çalıştı ... hepsi bir hafta sonra çökene kadar. Bu bir aydan fazla bir hayal kırıklığı ile devam etti.
Dosyanızı Herkese Açık Hale Getirin
Dosyanızdaki izinleri belgelerde açıklandığı gibi herkese açık olarak ayarlayabilirsiniz . Bu, Bulut Depolama Tarayıcınızdan veya Düğüm sunucunuzdan yapılabilir. Bir dosyayı genel veya bir dizini veya tüm Depolama veritabanınızı yapabilirsiniz. Düğüm kodu şöyledir:
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));
});
Sonuç, Bulut Depolama Tarayıcınızda şöyle görünecektir:
Dosyanızı indirmek için herkes standart yolu kullanabilir:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
Bir dosyayı genel yapmanın başka bir yolu da makePublic () yöntemini kullanmaktır . Bunu çalıştırmayı başaramadım, kova ve dosya yollarını doğru bir şekilde almak zor.
İlginç bir alternatif, Erişim Kontrol Listelerini kullanmaktır . Bir dosyayı yalnızca bir listeye koyduğunuz kullanıcılar için kullanılabilir authenticatedRead
hale getirebilir veya dosyayı bir Google hesabından oturum açmış herkesin kullanımına sunabilirsiniz. "Firebase Auth kullanarak uygulamama giriş yapan herkes" seçeneği olsaydı, erişimi yalnızca kullanıcılarımla sınırlayacağı için bunu kullanırdım.
FirebaseStorageDownloadTokens ile Kendi İndirme URL'nizi Oluşturun
Birkaç yanıt, belgelenmemiş bir Google Storage nesnesi özelliğini tanımlar firebaseStorageDownloadTokens
. Bununla Storage'a kullanmak istediğiniz jetonu söyleyebilirsiniz. uuid
Node modülü ile bir token oluşturabilirsiniz . Dört satır kod ve kendi indirme URL'nizi, konsoldan aldığınız indirme URL'sini veya getDownloadURL()
. Dört satır kod şunlardır:
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);
Kod bağlamında şöyledir:
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));
});
Bu bir yazım hatası değil - firebaseStorageDownloadTokens
çift katman halinde yuvalanmanız gerekiyor metadata:
!
Doug Stevenson firebaseStorageDownloadTokens
, bunun resmi bir Google Bulut Depolama özelliği olmadığına dikkat çekti . Herhangi bir Google belgesinde bulamayacaksınız ve gelecekteki sürümünde olacağına dair bir söz yok @google-cloud
. Seviyorum firebaseStorageDownloadTokens
çünkü istediğimi elde etmenin tek yolu bu, ama güvenli olmadığı bir "kokusu" var.
Neden Node'dan getDownloadURL () yok?
@Clinton'ın yazdığı gibi, Google file.getDownloadURL()
bir yöntem oluşturmalıdır @google-cloud/storage
(yani, Düğüm arka ucunuz ). Google Cloud Functions'tan bir dosya yüklemek ve jeton indirme URL'sini almak istiyorum.