从使用Cloud Functions for Firebase上传的文件中获取下载URL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从使用Cloud Functions for Firebase上传的文件中获取下载URL相关的知识,希望对你有一定的参考价值。
在Firebase存储中使用函数for Firebase上传文件后,我想获取该文件的下载URL。
我有这个 :
...
return bucket
.upload(fromFilePath, {destination: toFilePath})
.then((err, file) => {
// Get the download url of file
});
目标文件有很多参数。甚至一个名为mediaLink
。但是,如果我尝试访问此链接,我会收到此错误:
匿名用户没有storage.objects.get访问对象...
有人可以告诉我如何获取公共下载Url?
谢谢
您需要通过getSignedURL NPM模块使用@google-cloud/storage生成签名URL。
例:
const gcs = require('@google-cloud/storage')({keyFilename: 'service-account.json'});
// ...
const bucket = gcs.bucket(bucket);
const file = bucket.file(fileName);
return file.getSignedUrl({
action: 'read',
expires: '03-09-2491'
}).then(signedUrls => {
// signedUrls[0] contains the file's public URL
});
您需要使用@google-cloud/storage
初始化your service account credentials,因为应用程序默认凭据是不够的。
更新:云存储SDK现在可以通过Firebase Admin SDK访问,该SDK位于@ google-cloud / storage周围的acts as a wrapper。唯一的方法是你要么:
- 使用特殊服务帐户启动SDK,通常通过第二个非默认实例。
- 或者,如果没有服务帐户,则为默认的App Engine服务帐户提供“signBlob”权限。
这是我目前使用的,它很简单,它完美无缺。
您无需对Google Cloud执行任何操作。它与Firebase开箱即用。
// Save the base64 to storage.
const file = admin.storage().bucket('url found on the storage part of firebase').file(`profile_photos/${uid}`);
await file.save(base64Image, {
metadata: {
contentType: 'image/jpeg',
},
predefinedAcl: 'publicRead'
});
const metaData = await file.getMetadata()
const url = metaData[0].mediaLinkenter
如果您只需要一个包含简单URL的公共文件,则此方法有效。请注意,这可能会否决您的Firebase存储规则。
bucket.upload(file, function(err, file) {
if (!err) {
//Make the file public
file.acl.add({
entity: 'allUsers',
role: gcs.acl.READER_ROLE
}, function(err, aclObject) {
if (!err) {
var URL = "https://storage.googleapis.com/[your bucket name]/" + file.id;
console.log(URL);
} else {
console.log("Failed to set permissions: " + err);
}
});
} else {
console.log("Upload failed: " + err);
}
});
我有同样的问题,但是,我正在查看firebase函数示例的代码而不是README。并且这个帖子的答案也没有帮助......
您可以通过执行以下操作来避免传递配置文件:
转到项目的Cloud Console > IAM & admin > IAM,找到App Engine默认服务帐户,并将服务帐户令牌创建者角色添加到该成员。这将允许您的应用为图片创建签名的公共URL。
来源:Automatically Generate Thumbnails function README
您的应用引擎角色应如下所示:
此答案将总结在将文件上传到Google / Firebase云存储时获取下载URL的选项。下载URL有三种类型:
- 已签名的下载URL,这些URL是临时的,具有安全功能
- 令牌下载URL,具有持久性并具有安全功能
- 公共下载URL,持久且缺乏安全性
获取令牌下载URL有三种方法。其他两个下载URL只有一种方法可以获取它们。
从Firebase存储控制台
您可以从Firebase存储控制台获取下载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()从前端
documentation告诉我们使用getDownloadURL()
:
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
这将获得与Firebase存储控制台相同的下载URL。这种方法很简单,但要求您知道文件的路径,在我的应用程序中,该文件的路径大约是300行代码,用于相对简单的数据库结构。如果您的数据库很复杂,这将是一场噩梦。您可以从前端上传文件,但这会将您的凭据公开给下载您应用的任何人。因此,对于大多数项目,您需要从Node后端或Google Cloud Functions上传文件,然后获取下载URL并将其与其他有关您文件的数据一起保存到数据库中。
用于临时下载URL的getSignedUrl()
getSignedUrl()易于从Node后端或Google Cloud功能使用:
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从未说过你签名的网址会在一周内过期。文档代码将3-17-2025
作为到期日期,建议您可以设置将来的到期年限。我的应用程序工作得很好,然后一周后崩溃了。错误消息表示签名不匹配,而不是下载URL已过期。我对我的代码进行了各种更改,一切正常......直到一周后它都崩溃了。这持续了一个多月的挫折。
使您的文件公开可用
您可以将文件的权限设置为公开读取,如documentation中所述。这可以从云存储浏览器或节点服务器完成。您可以将一个文件设为公用文件,也可以将目录设置为整个存储数这是节点代码:
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/syste以上是关于从使用Cloud Functions for Firebase上传的文件中获取下载URL的主要内容,如果未能解决你的问题,请参考以下文章
从 Cloud Functions for Firebase 中的数据库触发器获取用户 ID?
具有 Cloud Functions for Firebase 的自定义观察者
Cloud Functions for Firebase:无法访问 BigQuery
从 Cloud Functions for Firebase 中的 Firestore 触发器获取用户 ID?
使用 spark(免费)firebase 计划使用 Cloud Functions for Firebase 导出 excel
如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?