【问题标题】:Why do browsers ignore content-disposition headers for file names sometimes?为什么浏览器有时会忽略文件名的内容处置标头?
【发布时间】: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


    【解决方案1】:

    如果在对象上设置了 ContentDisposition 标头,它将覆盖 response-content-disposition 查询参数。

    所以我的猜测是,当您上传具有某些已知需要非内联显示的扩展名(如 PDF)的对象时,您使用的是在元数据上设置 ContentDisposition 的库或工具。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2017-06-25
      • 2014-08-15
      • 2020-05-23
      • 2019-05-16
      • 2018-08-10
      相关资源
      最近更新 更多