【发布时间】:2021-03-12 19:50:09
【问题描述】:
我正在开发的 Next.Js/React 应用程序利用 Firebase 的云存储来存储 .doc/.docx/.pdf 文件。我希望能够在下载时在浏览器文档查看器中动态更改建议的文件名,但是有时我只能让它工作。由于我想保持原始文件名相同,因此我也无法永久更改云存储中的元数据。
我发现,只有在原始文件名的标题中不包含“.pdf”或“.docx”时,才能从云存储请求签名的 url 并添加 responseDisposition 属性。
这是我的服务器处理程序代码,它请求签名的 url 并将其发送回客户端:
const {firebaseInit} = require('../../firebase-admin-init');
const fetchResumeLink = async (req,res) => {
const {documentPath, dynamicName} = req.body;
const bucket = firebaseInit.storage().bucket();
const file = bucket.file(documentPath);
const today = new Date();
const tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);
const config = {
action: 'read',
responseDisposition: `attachment; filename=Resume_for_${dynamicName}.pdf`,
expires: tomorrow
}
file.getSignedUrl(config, (err, url) => {
if (err) {
console.error(err);
res.status(500).send(err);
} else {
res.setHeader('Content-Type', 'application/pdf')
res.status(200).send(url);
}
});
}
如果原始文件包含在 /bucket/folder/obj 之类的存储路径中,则此方法仅在 Chrome 中有效,但如果它位于 /bucket/folder/obj.pdf,则它似乎不再有效。在 Mozilla 上,我遇到了一个实例,其中选项卡显示正确的文件名,但当提示下载文件时,原始文件名是原始文件名。
有人知道为什么会这样吗?有没有办法让浏览器文档阅读器不忽略 content-disposition 标头?
也可以使用任何其他方法来动态生成文件的保存名称。
【问题讨论】:
标签: javascript firebase google-chrome http-headers google-cloud-storage