Javascript 如何在浏览器中触发从Firebase功能下载GCS中的图像?

Javascript 如何在浏览器中触发从Firebase功能下载GCS中的图像?,javascript,node.js,firebase,google-cloud-storage,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Storage,Google Cloud Functions,我正在使用Firebase云功能,以便我的用户可以从GCS下载图像,而不是在浏览器中查看 问题在于,由于某些原因,某些图像仍显示在浏览器中 我有什么遗漏吗 const request = require('request'); const mime = require('mime-types'); exports.downloadFile = functions.https.onRequest((req, res) => { const url = req.query.url;

我正在使用Firebase云功能,以便我的用户可以从GCS下载图像,而不是在浏览器中查看

问题在于,由于某些原因,某些图像仍显示在浏览器中

我有什么遗漏吗

const request = require('request');
const mime = require('mime-types');

exports.downloadFile = functions.https.onRequest((req, res) => {

    const url = req.query.url;
    const filename = url.split('/').pop();
    const mimetype = mime.lookup(filename);

    const headers = {
        'Content-Disposition': 'attachment; filename=' + filename,
        'Content-type': mimetype
    };

    res.set(headers);

    request(url).pipe(res);
});

尝试将内容类型设置为
application/octet stream
,而不是从文件加载的内容类型

mime类型规范将
应用程序/octet流
描述为任意二进制数据。所有主要浏览器都支持它

此外,您的href标记可能会使用

编辑:
有些浏览器倾向于从文件头检测mime类型。为了防止mime类型检测和强制下载,除了修改内容类型外,还必须添加
内容传输编码:Binary

尝试将内容类型设置为
application/octet stream
,而不是从文件加载的内容类型

mime类型规范将
应用程序/octet流
描述为任意二进制数据。所有主要浏览器都支持它

此外,您的href标记可能会使用

编辑:

有些浏览器倾向于从文件头检测mime类型。为了防止mime类型检测和强制下载,除了修改内容类型外,还必须添加
内容传输编码:Binary

请注意,如果您这样做,您将支付双倍的出口费用。一次用于云存储,另一次用于云功能。我知道这一点。如果你有更好的解决方案,我洗耳恭听。答案中的下载标签看起来很有希望!不工作,因为它不是同一个域…请注意,如果你这样做,你要支付双倍的出口费用。一次用于云存储,另一次用于云功能。我知道这一点。如果你有更好的解决方案,我洗耳恭听。答案中的下载标签看起来很有希望!不起作用,因为它不是同一个域…我已将内容类型设置为
application/octet stream
,但由于某些原因,对于某些文件,它们仍然显示在浏览器中,而不是下载。我将尝试
下载
属性。与
下载
属性的结果相同。根据文档,它必须是同一个域:让我们尝试添加额外的标题:
内容传输编码:Binary
,至少对于某些文件。请更新您的答案。我还有一个问题,我将在一个新问题中发布。还应该注意的是,这只能在小于10MB的文件中完成,因为这是使用云函数的HTTP请求的最大大小。我已经将内容类型设置为
application/octet-stream
,但由于某些原因,对于某些文件,它们仍然显示在浏览器中而不是下载。我将尝试
下载
属性。与
下载
属性的结果相同。根据文档,它必须是同一个域:让我们尝试添加额外的标题:
内容传输编码:Binary
,至少对于某些文件。请更新您的答案。我还有一个问题,我将在一个新问题中发布。还应该注意的是,这只能在小于10MB的文件中完成,因为这是使用云函数的HTTP请求的最大大小。