如何在Firebase函数中获取Firebase生成的下载URL
如何在Firebase函数中获取Firebase生成的下载URL
这个问题已经有了答案:
我使用Flutter的Firebase sdk上传了图片,在Flutter端,我通常只需要在引用上调用getDownloadUrl()函数,然后我想在我的Cloud Function触发器中获取该URL,如果图片被上传到Firebase Storage中,我将获得下载URL并在firestore上发布它。
我尝试获取媒体链接的元数据,但它不是我可以手动从浏览Firebase存储控制台中找到的相同URL。
exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => { const db = admin.firestore(); const filePath = object.name; const contentType = object.contentType; const fileDir = path.dirname(filePath); const fileName = path.basename(filePath); const jobId = fileName.replace("poster_","").replace(".png",""); const bucket = admin.storage().bucket(object.bucket); const file = bucket.file(filePath); const posterMetadata = await file.getMetadata(); const posterFileUrl = posterMetadata[0].mediaLink; return functions.logger.log('url: '+posterFileUrl ); }
使用那个URL,我遇到了“匿名调用者没有storage.objects.get访问Google Cloud Storage对象”的错误。
如何获取这个生成的链接,我们可以在firebase storage控制台上找到它。
admin 更改状态以发布 2023年5月23日
我理解在 Cloud Function 被触发时,有一个新文件被上传到 Cloud Storage,你想获取这个文件的签名 URL。
以下将会解决问题:
exports.generateFileURL = functions.storage.object().onFinalize(async object => { try { const bucket = admin.storage().bucket(object.bucket); const file = bucket.file(object.name); const signedURLconfig = { action: 'read', expires: '01-01-2030' }; const signedURLArray = await file.getSignedUrl(signedURLconfig); const url = signedURLArray[0]; // Do whatever you want with the signed URL // e.g. save it to Firestore await admin.firestore().collection('signedURLs').add({ fileName: object.name, signedURL: url }) return null; } catch (error) { console.log(error); return null; } });
我们使用 Cloud Storage Node.js 客户端 API 中的 getSignedUrl()
方法。在文档中,你会找到更多关于传递给该方法的配置对象 (在上面的示例中,即 signedURLconfig
) 的可能属性和值的详细信息。