यह उत्तर Google / Firebase Cloud Storage में फ़ाइल अपलोड करते समय डाउनलोड URL प्राप्त करने के विकल्पों को संक्षेप में प्रस्तुत करेगा। डाउनलोड यूआरएल तीन प्रकार के होते हैं:
- डाउनलोड किए गए डाउनलोड किए गए URL, जो अस्थायी हैं और जिनमें सुरक्षा सुविधाएँ हैं
- टोकन डाउनलोड URL, जो लगातार बने रहते हैं और उनमें सुरक्षा विशेषताएं होती हैं
- सार्वजनिक डाउनलोड URL, जो लगातार हैं और सुरक्षा की कमी है
टोकन डाउनलोड URL प्राप्त करने के तीन तरीके हैं। अन्य दो डाउनलोड URL के पास उन्हें प्राप्त करने का केवल एक ही तरीका है।
फायरबेस स्टोरेज कंसोल से
आप फायरबेस स्टोरेज कंसोल से डाउनलोड URL प्राप्त कर सकते हैं:
डाउनलोड 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 क्लाउड फ़ंक्शंस से अपलोड करना चाहते हैं, फिर डाउनलोड URL प्राप्त करें और इसे अपनी फ़ाइल के बारे में अन्य डेटा के साथ अपने डेटाबेस में सहेजें।
अस्थायी डाउनलोड URL के लिए getSignUrl ()
getSignedUrl () एक नोड बैक एंड या Google क्लाउड फ़ंक्शंस से उपयोग करना आसान है:
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 की समय सीमा समाप्त हो गई थी। मैंने अपने कोड में कई बदलाव किए, और सब कुछ काम किया ... जब तक कि यह सब एक हफ्ते बाद दुर्घटनाग्रस्त नहीं हो गया। यह एक महीने से अधिक की निराशा के लिए चला गया।
अपनी फ़ाइल सार्वजनिक रूप से उपलब्ध कराएँ
आप अपनी फ़ाइल पर अनुमतियों को सार्वजनिक रूप से पढ़ने के लिए सेट कर सकते हैं, जैसा कि प्रलेखन में समझाया गया है । यह क्लाउड स्टोरेज ब्राउज़र या आपके नोड सर्वर से किया जा सकता है। आप एक फ़ाइल को सार्वजनिक कर सकते हैं या एक निर्देशिका या आपके संपूर्ण संग्रहण डेटाबेस को बना सकते हैं। यहाँ नोड कोड है:
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));
});
परिणाम आपके क्लाउड स्टोरेज ब्राउज़र में इस तरह दिखेगा:
कोई भी आपकी फ़ाइल को डाउनलोड करने के लिए मानक पथ का उपयोग कर सकता है:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
किसी फ़ाइल को सार्वजनिक करने का एक और तरीका है मेक रिपब्लिक () का उपयोग करना । मैं यह काम करने में सक्षम नहीं हूं, यह बाल्टी पाने के लिए मुश्किल है और रास्ते सही हैं।
एक दिलचस्प विकल्प एक्सेस कंट्रोल लिस्ट का उपयोग करना है । आप केवल उन्हीं उपयोगकर्ताओं को फाइल उपलब्ध करवा सकते हैं जिन्हें आप सूची में रखते हैं, या authenticatedRead
Google खाते से लॉग-इन करने के लिए फाइल उपलब्ध कराने के लिए उपयोग करते हैं। अगर कोई विकल्प होता "कोई भी जो Firebase Auth का उपयोग करके मेरे ऐप में लॉग इन करता" तो मैं इसका उपयोग करता, क्योंकि यह केवल मेरे उपयोगकर्ताओं तक पहुंच को सीमित करता था।
FirebaseStorageDownloadTokens के साथ अपना खुद का डाउनलोड URL बनाएँ
कई उत्तर एक अनिर्दिष्ट Google संग्रहण ऑब्जेक्ट संपत्ति का वर्णन करते हैं firebaseStorageDownloadTokens
। इससे आप स्टोरेज टोकन को बता सकते हैं जिसका आप उपयोग करना चाहते हैं। आप 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:
!
डग स्टीवेन्सन ने बताया कि firebaseStorageDownloadTokens
यह आधिकारिक Google क्लाउड स्टोरेज सुविधा नहीं है। आप इसे किसी भी Google दस्तावेज़ में नहीं पाएंगे, और इसका कोई वादा नहीं है कि यह भविष्य के संस्करण में होगा@google-cloud
। मुझे पसंद है firebaseStorageDownloadTokens
क्योंकि यह वही है जो मैं चाहता हूं, लेकिन यह एक "गंध" है जिसका उपयोग करना सुरक्षित नहीं है।
क्यों नहीं GetDownloadURL () नोड से?
जैसा कि @ क्लिंटन ने लिखा, Google को (यानी, आपका नोड बैक एंड) file.getDownloadURL()
में एक तरीका बनाना चाहिए @google-cloud/storage
। मैं Google क्लाउड फ़ंक्शंस से एक फ़ाइल अपलोड करना चाहता हूं और टोकन डाउनलोड URL प्राप्त करना चाहता हूं।