首页 > 解决方案 > 如何将上传到 Firebase 存储的文件设置为可通过浏览器按钮下载?

问题描述

我正在一个管理面板上工作,在那里我有一个应用程序上传的照片图库(该应用程序是由另一家公司开发的,我无法更改其中的任何内容)。

该应用程序正在将图像上传到我拥有完全访问权限的 Firebase 存储帐户。此外,该应用程序将带有令牌的图像 url 存储在数据库中。示例:https ://firebasestorage.googleapis.com/v0/b/reeapp-50481.appspot.com/o/testing%2Fduke.jpg?alt=media&token=90ed99bb-28ec-4ebb-a8c6-3764fc5ec4a3

我可以在管理面板中填充照片库,但我无法使用典型的 HTML 做法和上面的 url 为图像制作下载按钮,例如

<a href="https://firebasestorage.googleapis.com/v0/b/reeapp-50481.appspot.com/o/testing%2Fduke.jpg?alt=media&token=90ed99bb-28ec-4ebb-a8c6-3764fc5ec4a3" download="myfile.jpg">Download</a>

或者

    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = (event) => {
        var blob = xhr.response;
    };
    xhr.open('GET', 'https://firebasestorage.googleapis.com/v0/b/reeapp-50481.appspot.com/o/testing%2Fduke.jpg?alt=media&token=90ed99bb-28ec-4ebb-a8c6-3764fc5ec4a3');
    xhr.send();

我能够使用gsutil将内容处置设置为附件,然后允许我强制为用户下载,但据我所知,我无法将存储桶设置为 content-disposition=attachment,只是单个对象。我需要所有未来的上传都可以下载。

有没有人知道如何在我尝试下载之前按需设置它,或者设置存储桶本身以具有此设置,以便其中的所有未来对象都可以下载?

提前致谢!


编辑 1:似乎我正在取得进展,但现在我有点不确定发生了什么。我找到了一种方法来更新我的 Google Cloud 存储对象的元数据,因此我现在可以在尝试开始下载之前将 contentDisposition 设置为附件。看起来它适用于我的第一张图片。但后来我用另一个图像尝试了同样的事情,但它不起作用。叹。

    function forceDownload(imgRefUrl) {
        var storage = firebase.storage();
        var myFile = storage.refFromURL(imgRefUrl);

        myFile.getMetadata().then((data)=>console.log('BEFORE ', data));

        myFile.updateMetadata({ contentDisposition: 'attachment', contentEncoding: 'binary' }).then( (resp) => {
            console.log('AFTER ', resp);

            var xhr = new XMLHttpRequest();
            xhr.responseType = 'blob';
            xhr.onload = (event) => {
                var blob = xhr.response;
            };
            xhr.open('GET', imgRefUrl);
            xhr.send();
            myFile.getMetadata().then((data)=>console.log('COMPLETED ', data));
        })
        .catch((error) => {
            // Handle any errors
            console.log("error", error)
        });
    }

所以我确认内容处置现在是下载尝试之前的附件,但仍然没有雪茄:-/

编辑2:好的,这完全打破了我的大脑。我已经上传了 5 次同一张图片。在第一个上,我上面名为forceDownload的函数起作用,使浏览器下载图像,而不是重定向浏览器以显示图像。但所有其他 4 个仍在重定向而不是开始下载。它们都是同一个文件。

唯一不同的是第一个,我已经注释掉了整个 XMLHttpRequest,运行了设置元数据的函数,然后尝试了该<a href="..." download="randomname.jpg">Download</a>方法。在尝试了完整的 forceDownload 功能后,我无法与其他人一起重现这一点。

因此,我上传了同一张图片的第 6 个实例,并在 XMLHttpRequest 注释掉的情况下运行了 forceDownload 函数。然后我单击带有下载属性集的链接。它强制下载。

所以,这就是我的想法,如果您在设置元数据之前尝试下载它,浏览器中会设置某种缓存。为了测试这个理论,我尝试了一个全新的浏览器,但遇到了浏览器重定向我而不是下载图像的相同问题。我失去了想法。也许它缓存在firebase中?

标签: phphtmlfirebasegoogle-cloud-storagefirebase-storage

解决方案


推荐阅读