Jawaban ini akan merangkum opsi untuk mendapatkan URL download saat mengupload file ke Google / Firebase Cloud Storage. Ada tiga jenis URL unduhan:
- URL unduhan yang ditandatangani, yang bersifat sementara dan memiliki fitur keamanan
- URL unduhan token, yang persisten dan memiliki fitur keamanan
- URL unduhan publik, yang persisten dan kurang keamanan
Ada tiga cara untuk mendapatkan URL unduhan token. Dua URL unduhan lainnya hanya memiliki satu cara untuk mendapatkannya.
Dari Konsol Penyimpanan Firebase
Anda bisa mendapatkan URL download dari Firebase Storage console:
URL unduhan terlihat seperti ini:
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
Bagian pertama adalah jalur standar ke file Anda. Pada akhirnya adalah tanda. URL unduhan ini bersifat permanen, yaitu tidak akan kedaluwarsa, meskipun Anda dapat mencabutnya.
getDownloadURL () Dari Front End
The dokumentasi memberitahu kita untuk menggunakan getDownloadURL()
:
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
Ini mendapatkan URL unduhan yang sama yang bisa Anda dapatkan dari konsol Firebase Storage. Metode ini mudah tetapi mengharuskan Anda mengetahui jalur ke file Anda, yang dalam aplikasi saya berisi sekitar 300 baris kode, untuk struktur database yang relatif sederhana. Jika database Anda rumit, ini akan menjadi mimpi buruk. Dan Anda dapat mengunggah file dari ujung depan, tetapi ini akan mengekspos kredensial Anda kepada siapa pun yang mengunduh aplikasi Anda. Jadi untuk sebagian besar proyek, Anda pasti ingin mengunggah file Anda dari Node back end atau Google Cloud Functions, lalu dapatkan URL unduhan dan simpan ke database Anda bersama dengan data lain tentang file Anda.
getSignedUrl () untuk URL Unduhan Sementara
getSignedUrl () mudah digunakan dari back end Node atau Google Cloud Functions:
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 unduhan yang ditandatangani terlihat seperti ini:
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 yang ditandatangani memiliki tanggal kedaluwarsa dan tanda tangan yang panjang. Dokumentasi untuk baris perintah gsutil signurl -d mengatakan bahwa URL bertanda tangan bersifat sementara: masa berlaku default adalah satu jam dan masa berakhir maksimum adalah tujuh hari.
Saya akan mengomel di sini bahwa getSignedUrl tidak pernah mengatakan bahwa URL Anda yang ditandatangani akan kedaluwarsa dalam seminggu. Kode dokumentasi memiliki 3-17-2025
tanggal kedaluwarsa, yang menyarankan agar Anda dapat mengatur tahun kedaluwarsa di masa mendatang. Aplikasi saya bekerja dengan sempurna, lalu mogok seminggu kemudian. Pesan kesalahan mengatakan bahwa tanda tangan tidak cocok, bukan bahwa URL unduhan telah kedaluwarsa. Saya membuat berbagai perubahan pada kode saya, dan semuanya bekerja ... sampai semuanya macet seminggu kemudian. Ini berlangsung selama lebih dari sebulan karena frustrasi.
Buat File Anda Tersedia untuk Publik
Anda dapat mengatur izin pada file Anda untuk dibaca publik, seperti yang dijelaskan dalam dokumentasi . Ini dapat dilakukan dari Cloud Storage Browser atau dari server Node Anda. Anda dapat membuat satu file menjadi publik atau direktori atau seluruh database Storage Anda. Inilah kode Node:
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));
});
Hasilnya akan terlihat seperti ini di Cloud Storage Browser Anda:
Siapa pun kemudian dapat menggunakan jalur standar untuk mengunduh file Anda:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
Cara lain untuk membuat file menjadi publik adalah dengan menggunakan metode makePublic () . Saya belum bisa membuatnya berfungsi, sulit untuk mendapatkan bucket dan jalur file yang benar.
Alternatif yang menarik adalah dengan menggunakan Daftar Kontrol Akses . Anda dapat membuat file tersedia hanya untuk pengguna yang Anda masukkan ke dalam daftar, atau gunakan authenticatedRead
untuk membuat file tersedia bagi siapa saja yang masuk dari akun Google. Jika ada opsi "siapa saja yang login ke aplikasi saya menggunakan Firebase Auth", saya akan menggunakan ini, karena akan membatasi akses hanya untuk pengguna saya.
Buat URL Download Anda Sendiri dengan firebaseStorageDownloadTokens
Beberapa jawaban mendeskripsikan properti objek Google Storage yang tidak terdokumentasi firebaseStorageDownloadTokens
. Dengan ini, Anda dapat memberi tahu Storage, token yang ingin Anda gunakan. Anda dapat membuat token dengan uuid
modul Node. Empat baris kode dan Anda dapat membuat URL unduhan Anda sendiri, URL unduhan yang sama yang Anda dapatkan dari konsol atau getDownloadURL()
. Empat baris kode tersebut adalah:
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);
Berikut kode dalam konteks:
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));
});
Itu bukan kesalahan ketik - Anda harus membuat firebaseStorageDownloadTokens
lapisan ganda metadata:
!
Doug Stevenson menunjukkan bahwa firebaseStorageDownloadTokens
itu bukan fitur Google Cloud Storage resmi. Anda tidak akan menemukannya di dokumentasi Google mana pun, dan tidak ada janji akan menemukannya di versi mendatang @google-cloud
. Saya suka firebaseStorageDownloadTokens
karena itu satu-satunya cara untuk mendapatkan apa yang saya inginkan, tetapi memiliki "bau" yang tidak aman digunakan.
Mengapa Tidak Ada getDownloadURL () dari Node?
Seperti yang ditulis @Clinton, Google harus membuat file.getDownloadURL()
metode di @google-cloud/storage
(yaitu, ujung belakang Node Anda). Saya ingin mengupload file dari Google Cloud Functions dan mendapatkan URL download token.