php - 如何将上传到 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中?
解决方案
推荐阅读
- c++ - 为什么更改数组的第 0 个索引会比第 0 个索引更改更多?
- sql - 嵌套查询评估
- c# - 将 VBA 宏添加到 powerpoint
- c# - 编写自定义身份验证 + 我如何检查到哪个端点请求
- python - 将简单的 IDL 参数代码转换为 python 代码
- mysql - PhpMyAdmin 突然显示错误
- angular - 如何在源数组更改后从特定索引以角度启动引导轮播
- node.js - Webpack + Electron:如果应用程序没有它,为什么我需要“电子渲染器”脚本?
- ios - 我可以在没有 https 的情况下将我的应用程序发布到 App Store 吗?
- php - 我运行报告时需要保留三位小数