Câu trả lời này sẽ tóm tắt các tùy chọn để lấy URL tải xuống khi tải tệp lên Google / Firebase Cloud Storage. Có ba loại URL tải xuống:
- URL tải xuống đã ký, là URL tạm thời và có các tính năng bảo mật
- URL tải xuống mã thông báo, liên tục và có các tính năng bảo mật
- URL tải xuống công khai, liên tục và thiếu bảo mật
Có ba cách để lấy URL tải xuống mã thông báo. Hai URL tải xuống khác chỉ có một cách để lấy chúng.
Từ Bảng điều khiển lưu trữ Firebase
Bạn có thể lấy URL tải xuống từ bảng điều khiển Firebase Storage:
URL tải xuống có dạng như sau:
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
Phần đầu tiên là một đường dẫn tiêu chuẩn đến tệp của bạn. Cuối cùng là mã thông báo. URL tải xuống này là vĩnh viễn, tức là, nó sẽ không hết hạn, mặc dù bạn có thể thu hồi nó.
getDownloadURL () Từ Giao diện Người dùng
Các tài liệu hướng dẫn cho chúng ta biết để sử dụng getDownloadURL()
:
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
Điều này nhận được cùng một URL tải xuống mà bạn có thể lấy từ bảng điều khiển lưu trữ Firebase của mình. Phương pháp này dễ dàng nhưng yêu cầu bạn phải biết đường dẫn đến tệp của mình, trong ứng dụng của tôi có khoảng 300 dòng mã, cho một cấu trúc cơ sở dữ liệu tương đối đơn giản. Nếu cơ sở dữ liệu của bạn phức tạp thì đây sẽ là một cơn ác mộng. Và bạn có thể tải tệp lên từ giao diện người dùng, nhưng điều này sẽ làm lộ thông tin đăng nhập của bạn cho bất kỳ ai tải xuống ứng dụng của bạn. Vì vậy, đối với hầu hết các dự án, bạn sẽ muốn tải tệp của mình lên từ Node back end hoặc Google Cloud Functions, sau đó lấy URL tải xuống và lưu nó vào cơ sở dữ liệu cùng với dữ liệu khác về tệp của bạn.
getSignedUrl () cho URL Tải xuống Tạm thời
getSignedUrl () dễ sử dụng từ Node back end hoặc 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 tải xuống đã ký trông giống như sau:
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 đã ký có ngày hết hạn và chữ ký dài. Tài liệu cho dòng lệnh gsutil signurl -d nói rằng các URL đã ký là tạm thời: thời hạn mặc định là một giờ và thời hạn tối đa là bảy ngày.
Ở đây tôi sẽ không nói rằng getSignedUrl không bao giờ nói rằng URL đã ký của bạn sẽ hết hạn sau một tuần. Mã tài liệu có3-17-2025
ngày hết hạn, gợi ý rằng bạn có thể đặt năm hết hạn trong tương lai. Ứng dụng của tôi hoạt động hoàn hảo và sau đó bị lỗi một tuần sau đó. Thông báo lỗi cho biết chữ ký không khớp, không phải URL tải xuống đã hết hạn. Tôi đã thực hiện các thay đổi khác nhau đối với mã của mình và mọi thứ đều hoạt động ... cho đến khi tất cả bị sập một tuần sau đó. Điều này đã diễn ra trong hơn một tháng thất vọng.
Công khai tệp của bạn
Bạn có thể đặt các quyền trên tệp của mình ở chế độ đọc công khai, như được giải thích trong tài liệu . Điều này có thể được thực hiện từ Trình duyệt lưu trữ đám mây hoặc từ máy chủ Node của bạn. Bạn có thể đặt một tệp ở chế độ công khai hoặc một thư mục hoặc toàn bộ cơ sở dữ liệu Lưu trữ của mình. Đây là mã 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));
});
Kết quả sẽ như thế này trong Trình duyệt lưu trữ đám mây của bạn:
Sau đó, bất kỳ ai cũng có thể sử dụng đường dẫn chuẩn để tải xuống tệp của bạn:
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
Một cách khác để công khai tệp là sử dụng phương thức makePublic () . Tôi đã không thể làm cho điều này hoạt động, thật khó để sử dụng đúng đường dẫn của nhóm và tệp.
Một cách thay thế thú vị là sử dụng Danh sách Kiểm soát Truy cập . Bạn chỉ có thể cung cấp tệp cho những người dùng mà bạn đưa vào danh sách hoặc sử dụngauthenticatedRead
để cung cấp tệp cho bất kỳ ai đã đăng nhập từ tài khoản Google. Nếu có tùy chọn "bất kỳ ai đăng nhập vào ứng dụng của tôi bằng Firebase Auth", tôi sẽ sử dụng tùy chọn này, vì nó sẽ giới hạn quyền truy cập chỉ cho người dùng của tôi.
Tạo URL tải xuống của riêng bạn với firebaseStorageDownloadTokens
Một số câu trả lời mô tả thuộc tính đối tượng Google Storage không có giấy tờ firebaseStorageDownloadTokens
. Với điều này, bạn có thể cho Storage biết mã thông báo bạn muốn sử dụng. Bạn có thể tạo mã thông báo bằng uuid
mô-đun Node. Bốn dòng mã và bạn có thể tạo URL tải xuống của riêng mình, cùng một URL tải xuống mà bạn nhận được từ bảng điều khiển hoặc getDownloadURL()
. Bốn dòng mã là:
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);
Đây là mã trong ngữ cảnh:
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));
});
Đó không phải là lỗi đánh máy - bạn phải lồng firebaseStorageDownloadTokens
trong hai lớp metadata:
!
Doug Stevenson đã chỉ ra rằng đó firebaseStorageDownloadTokens
không phải là một tính năng chính thức của Google Cloud Storage. Bạn sẽ không tìm thấy nó trong bất kỳ tài liệu nào của Google và không có gì hứa hẹn rằng nó sẽ có trong phiên bản tương lai của @google-cloud
. Tôi thích firebaseStorageDownloadTokens
vì đó là cách duy nhất để đạt được thứ tôi muốn, nhưng nó có “mùi” không an toàn khi sử dụng.
Tại sao Không có getDownloadURL () từ Node?
Như @Clinton đã viết, Google nên tạo file.getDownloadURL()
một phương thức trong @google-cloud/storage
(tức là Node back end của bạn). Tôi muốn tải lên một tệp từ Google Cloud Functions và lấy URL tải xuống mã thông báo.