如何用Firebase Admin SDK获取Storage下载地址并在Node.js+multer场景下嵌入HTML img标签
解决方案
你已经将文件权限设置为公共可读,获取可直接在img标签中展示的访问地址有三种常用实现方式:
- 直接拼接固定格式的公共URL
GCS公开文件的地址格式固定,你可以直接用存储桶名+文件路径拼接:
const publicUrl = `https://storage.googleapis.com/${bucket.name}/img/${file.originalname}`;
拿到的地址可以直接填入img标签的src属性使用。
- 从你已经获取的元数据中提取
你调用的getMetadata()方法返回结果的第一个元素自带mediaLink字段,就是文件的访问地址:
const field = await files.getMetadata(); const publicUrl = field[0].mediaLink;
- 调用SDK自带方法获取
文件对象本身提供了现成的publicUrl()方法,不需要手动拼接:
const publicUrl = files.publicUrl();
完整实现示例
try { const file = req.file; const bucket = admin.storage().bucket(); const imageBuffer = Buffer.from(file.buffer, "base64"); const imageByteArray = new Uint8Array(imageBuffer); const options = { resumable: false, metadata: { contentType: file.mimetype }, predefinedAcl: "publicRead", public: true, }; const imageFile = bucket.file(`img/${file.originalname}`); await imageFile.save(imageByteArray, options); // 任选一种方式获取访问地址即可 const publicUrl = imageFile.publicUrl(); // 把publicUrl返回给前端,填入img标签的src属性就能正常展示 console.log(publicUrl); } catch (e) { console.error(e); }
补充说明
如果后续你需要把文件改为非公开权限,上面的公共地址会失效,此时可以调用files.getSignedUrl()方法生成临时访问的签名URL,同样可以正常放在img标签中使用。
内容的提问来源于stack exchange,提问作者Boom
相关产品推荐
相关产品推荐

