คำตอบนี้จะสรุปตัวเลือกในการรับ URL ดาวน์โหลดเมื่ออัปโหลดไฟล์ไปยัง Google / Firebase Cloud Storage URL ดาวน์โหลดมีสามประเภท:
- URL ดาวน์โหลดที่ลงนามซึ่งเป็นแบบชั่วคราวและมีคุณสมบัติด้านความปลอดภัย
- URL ดาวน์โหลดโทเค็นซึ่งคงอยู่และมีคุณสมบัติด้านความปลอดภัย
- URL ดาวน์โหลดสาธารณะซึ่งคงอยู่และขาดความปลอดภัย
มีสามวิธีในการรับ URL ดาวน์โหลดโทเค็น URL ดาวน์โหลดอีกสองรายการมีทางเดียวเท่านั้นที่จะได้รับ
จาก Firebase Storage Console
คุณสามารถรับ URL ดาวน์โหลดจากคอนโซล Firebase Storage:
URL ดาวน์โหลดมีลักษณะดังนี้:
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
ส่วนแรกคือพา ธ มาตรฐานไปยังไฟล์ของคุณ ในตอนท้ายคือโทเค็น URL ดาวน์โหลดนี้เป็นแบบถาวรกล่าวคือจะไม่มีวันหมดอายุแม้ว่าคุณจะสามารถเพิกถอนได้
getDownloadURL () จากส่วนหน้า
เอกสารบอกให้เราใช้งานgetDownloadURL()
:
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
ซึ่งจะได้รับ URL ดาวน์โหลดเดียวกับที่คุณจะได้รับจากคอนโซล Firebase Storage วิธีนี้ง่าย แต่ต้องการให้คุณรู้เส้นทางไปยังไฟล์ของคุณซึ่งในแอพของฉันมีโค้ดประมาณ 300 บรรทัดสำหรับโครงสร้างฐานข้อมูลที่ค่อนข้างง่าย หากฐานข้อมูลของคุณซับซ้อนนี่อาจเป็นฝันร้าย และคุณสามารถอัปโหลดไฟล์จากส่วนหน้าได้ แต่จะเปิดเผยข้อมูลรับรองของคุณต่อทุกคนที่ดาวน์โหลดแอปของคุณ ดังนั้นสำหรับโปรเจ็กต์ส่วนใหญ่คุณจะต้องอัปโหลดไฟล์ของคุณจากส่วนแบ็คเอนด์ของโหนดหรือ Google Cloud Functions จากนั้นรับ URL ดาวน์โหลดและบันทึกลงในฐานข้อมูลของคุณพร้อมกับข้อมูลอื่น ๆ เกี่ยวกับไฟล์ของคุณ
getSignedUrl () สำหรับ URL ดาวน์โหลดชั่วคราว
getSignedUrl ()ใช้งานง่ายจาก Node back end หรือ 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 ดาวน์โหลดที่มีลายเซ็นมีลักษณะดังนี้:
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 ที่เซ็นชื่อมีวันหมดอายุและลายเซ็นแบบยาว เอกสารสำหรับบรรทัดคำสั่งgsutil signurl -dระบุว่า URL ที่ลงนามเป็นแบบชั่วคราว: การหมดอายุเริ่มต้นคือหนึ่งชั่วโมงและการหมดอายุสูงสุดคือเจ็ดวัน
ฉันจะคุยโวว่าgetSignedUrlไม่เคยบอกว่า URL ที่ลงชื่อของคุณจะหมดอายุในหนึ่งสัปดาห์ รหัสเอกสารมี3-17-2025
เป็นวันหมดอายุซึ่งแนะนำว่าคุณสามารถกำหนดปีที่หมดอายุได้ในอนาคต แอปของฉันทำงานได้อย่างสมบูรณ์และเกิดข้อผิดพลาดในอีกหนึ่งสัปดาห์ต่อมา ข้อความแสดงข้อผิดพลาดบอกว่าลายเซ็นไม่ตรงกันไม่ใช่ว่า URL ดาวน์โหลดหมดอายุ ฉันทำการเปลี่ยนแปลงรหัสของฉันหลายอย่างและทุกอย่างก็ใช้ได้ ... จนกระทั่งมันพังในอีกหนึ่งสัปดาห์ต่อมา สิ่งนี้ดำเนินต่อไปเป็นเวลานานกว่าหนึ่งเดือนแห่งความหงุดหงิด
ทำให้ไฟล์ของคุณเปิดเผยต่อสาธารณะ
คุณสามารถกำหนดสิทธิ์ในไฟล์ของคุณเพื่ออ่านประชาชนตามที่อธิบายไว้ในเอกสาร ซึ่งสามารถทำได้จาก Cloud Storage Browser หรือจากเซิร์ฟเวอร์ Node ของคุณ คุณสามารถทำให้หนึ่งไฟล์เป็นสาธารณะหรือไดเร็กทอรีหรือฐานข้อมูล Storage ทั้งหมดของคุณ นี่คือรหัสโหนด:
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));
});
ผลลัพธ์จะมีลักษณะเช่นนี้ในเบราว์เซอร์ Cloud Storage ของคุณ:
จากนั้นทุกคนสามารถใช้เส้นทางมาตรฐานเพื่อดาวน์โหลดไฟล์ของคุณ:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
วิธีที่จะทำให้ประชาชนไฟล์หนึ่งคือการใช้วิธีการmakePublic () ฉันไม่สามารถทำให้มันใช้งานได้การทำให้ที่เก็บข้อมูลและเส้นทางไฟล์ถูกต้องเป็นเรื่องยาก
เป็นทางเลือกที่น่าสนใจคือการใช้รายการควบคุมการเข้าถึง คุณสามารถทำให้ไฟล์ใช้ได้เฉพาะกับผู้ใช้ที่คุณใส่ไว้ในรายการหรือใช้authenticatedRead
เพื่อทำให้ไฟล์นั้นพร้อมใช้งานสำหรับทุกคนที่ลงชื่อเข้าใช้จากบัญชี Google หากมีตัวเลือก "ใครก็ตามที่ลงชื่อเข้าใช้แอปของฉันโดยใช้ Firebase Auth" ฉันจะใช้ตัวเลือกนี้เพราะจะ จำกัด การเข้าถึงเฉพาะผู้ใช้ของฉันเท่านั้น
สร้าง URL ดาวน์โหลดของคุณเองด้วย firebaseStorageDownloadTokens
firebaseStorageDownloadTokens
หลายคำตอบที่ไม่มีเอกสารอธิบายคุณสมบัติวัตถุพื้นที่เก็บข้อมูล Google ด้วยวิธีนี้คุณสามารถบอกที่เก็บข้อมูลโทเค็นที่คุณต้องการใช้ คุณสามารถสร้างโทเค็นด้วยuuid
โมดูลโหนด สี่บรรทัดของรหัสและคุณสามารถสร้างดาวน์โหลด URL ของคุณเอง URL getDownloadURL()
ที่ดาวน์โหลดเดียวกับที่คุณได้รับจากคอนโซลหรือ รหัสสี่บรรทัดคือ:
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);
นี่คือรหัสในบริบท:
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));
});
นั่นไม่ใช่การพิมพ์ผิด - คุณต้องซ้อนเป็นfirebaseStorageDownloadTokens
สองชั้นmetadata:
!
Doug Stevenson ชี้ให้เห็นว่าfirebaseStorageDownloadTokens
นี่ไม่ใช่ฟีเจอร์ Google Cloud Storage อย่างเป็นทางการ คุณจะพบว่ามันไม่อยู่ในเอกสารใด ๆ ของ Google @google-cloud
และมีสัญญาก็จะอยู่ในรุ่นในอนาคตไม่มี ฉันชอบfirebaseStorageDownloadTokens
เพราะมันเป็นวิธีเดียวที่จะได้สิ่งที่ฉันต้องการ แต่มันมี "กลิ่น" ที่ไม่ปลอดภัยที่จะใช้
ทำไมไม่มี getDownloadURL () จาก Node
ตามที่ @Clinton เขียนไว้ Google ควรสร้างfile.getDownloadURL()
วิธีการใน@google-cloud/storage
(เช่น Node back end) ฉันต้องการอัปโหลดไฟล์จาก Google Cloud Functions และรับ URL ดาวน์โหลดโทเค็น