如何在Cloud Function的onFinalize中获取getDownloadURL?
如何在Cloud Storage的onFinalize函数中获取getDownloadURL?
我正在开发一个支持用户上传图片的网站。用户上传图片时会触发onFinalize函数,该函数会创建包含图片URL等信息的文档。在使用Cloud Function之前,我在客户端通过getDownloadURL获取图片URL并保存到文档中,但现在使用Cloud Function时,我只能通过图片元数据的mediaLink作为图片URL,发现其效果与getDownloadURL不一致。
当前使用的函数如下:
exports.imageFirestoreCreate = functions.storage .bucket() .object() .onFinalize(async (object) => { console.log(object); if ( object.contentType.startsWith("image/") && object.name.startsWith("images/") ) { const uploadDate = object.timeCreated; const imageLink = object.mediaLink; const images = firestore.collection("images"); return images.add({ imageURL: imageLink, createdAt: uploadDate, }); } else { return null; } });
请问是否可以在onFinalize中获取getDownloadURL?
当然可以在onFinalize函数中获取等效于getDownloadURL的访问链接。mediaLink是Cloud Storage的API内部访问链接,需要携带授权信息才能访问;而客户端的getDownloadURL生成的是带签名的公开访问URL,这就是两者效果不同的核心原因。
在Cloud Function中,你可以通过获取对应文件对象并调用getSignedUrl方法来生成和getDownloadURL效果一致的链接,具体修改后的代码如下:
const { Storage } = require('@google-cloud/storage'); const storage = new Storage(); const functions = require('firebase-functions'); const firestore = require('firebase-admin').firestore(); exports.imageFirestoreCreate = functions.storage .bucket() .onFinalize(async (object) => { console.log(object); if ( object.contentType.startsWith("image/") && object.name.startsWith("images/") ) { const uploadDate = object.timeCreated; // 获取当前存储桶中的目标文件对象 const file = storage.bucket(object.bucket).file(object.name); // 生成签名URL,配置为只读权限,有效期可自定义 const [imageLink] = await file.getSignedUrl({ action: 'read', expires: '03-01-2500' // 设置为远未来时间,近似永久有效 }); const images = firestore.collection("images"); return images.add({ imageURL: imageLink, createdAt: uploadDate, }); } else { return null; } });
需要注意的几点:
- 确保Cloud Function的服务账号拥有
storage.objects.get权限(默认情况下,Cloud Function的默认服务账号已具备该权限)。 - 签名URL的有效期可以根据业务需求调整,不需要永久有效时,设置合理的过期时间即可。
内容的提问来源于stack exchange,提问作者Coolkid
相关产品推荐
相关产品推荐

