我正在构建一个跨平台的移动应用程序,它使用Firebase进行数据存储和用户身份验证。我也使用SDK,它需要直接URL到某些mp4文件。到目前为止,我们已将这些视频文件托管在单独的服务器上,但由于Firebase的简单性和可扩展性,我希望将它们存储在它上面而不是单独存储。但是,我需要能够拥有该文件的直接URL。
当我使用文件的Firebase存储位置从浏览器访问测试文件时,例如:
APPNAME.appspot.com/RESOURCENAME.mp4
我收到404错误。
我已将规则设定为以下内容:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow write: if request.auth != null;
allow read: if true;
}
}
}
有没有办法直接从网址访问Firebase存储资源?
编辑:我应该补充一点,我需要一个非随机生成的URL,而是基于文件在存储中的逻辑位置,因为资源文件是根据应用程序中文件的UUID动态访问的。还有太多文件要存储/查找不可用的链接。
答案 0 :(得分:1)
对云存储中文件的默认访问权限取决于您的安全规则。这是故意的。
但是,无论何时通过Firebase SDK上传文件,它都会为该文件生成所谓的下载URL。下载URL是一个不可提供的URL,它提供对文件的只读访问权限。它是按照您在此处描述的方式与应用程序的其他用户共享。
要生成下载网址,请按照此处文档中的说明操作:https://firebase.google.com/docs/storage/ios/download-files#generate_a_download_url(其他平台的文档中也存在类似的部分)。
答案 1 :(得分:1)
虽然这不是您问题的答案,但您应该真正使用Firebase Hosting来实现此目的。与基于静态内容相比,Firebase存储更倾向于用户上传和共享。
使用Firebase CLI上传到托管非常简单。 https://www.youtube.com/watch?v=meofoNuK3vo您只需将要托管的文件放在“公开”文件夹中,然后运行firebase deploy
。
答案 2 :(得分:1)
意识到这篇文章现在有点麻烦了,但这是我的工作功能(为Vue.js 2编写),它使用下载和显示图像所需的正确URL更新了Firestore文档('profilePic')中的字段在网页上。未经音频文件测试。
submitImage() {
const user = firebase.auth().currentUser;
var storageRef = storage
.ref()
.child(`user/${user.uid}`)
.child(this.file.name);
//update the storage area with the image, and add the correct download URL to the database
storageRef
.put(this.file)
.then(function() {
console.log(`Successfully uploaded profile picture!`);
storageRef.getDownloadURL().then(function(url) {
profiles
.doc(user.uid)
.update({ profilePic: url })
.then(function() {
console.log("Successfully updated path");
})
.catch(function(error) {
console.error("There was a problem with the update", error);
});
});
this.file = null;
})
.catch(function(error) {
console.log("There was an error uploading the picture - ", error);
});
}
文件是从存储在变量“ file”中的html文件输入字段获得的,创建了一个存储路径(如果尚不存在),该存储路径以当前用户的UID命名,然后相应的firestore doc字段将使用getDownloadURL()的返回值进行更新(这是一个很长的字符串,其中包含对存储桶和访问令牌的引用)。现在,我的网络应用正确显示了图像:)。花了我一些时间来得到这个,所以我想分享对我有用的解决方案!
以供参考:https://firebase.google.com/docs/storage/web/download-files
答案 3 :(得分:0)
我试图找出与您相同的问题。因此,我检查了Firebase存储并单击图像。在那里,您应该看到一个小版本的图像。检查了Firebase的存储位置,并找到了它所在的URL。就像这样:
https://firebasestorage.googleapis.com/v0/b/" + yourappname + ".appspot.com/o/images%2F" + imagename+ "?alt=media
我还将读写设置更改为:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read;
allow write: if request.auth != null;
}
}
}