因此,我需要将文档保存到我的Firestore中,并且每个文档都有指向文件的链接(下载链接)。
为了实现这一目标,我:
您可以在代码中看到这一点。
这有以下问题:
function uploadFile(my_file) {
// Create a root reference
var storageRef = firebase.storage().ref();
var uploadTask = storageRef.child('info/' + my_file.name).put(my_file);
uploadTask.on('state_changed', function (snapshot) {
}, function (error) {
console.error("Error uploading file: ", error);
}, function () {
// Handle successful uploads on complete
uploadTask.snapshot.ref.getDownloadURL().then(function (downloadURL) {
uploadDocument(downloadURL);
});
});
}
function uploadDocument(downloadUrl) {
var name = document.forms["infoForm"]["name"].value;
var author = document.forms["infoForm"]["author"].value;
var documentObject = {
name: name,
author: author,
download_url: downloadUrl
};
db.collection("info").add(documentObject)
.then(function (docRef) {
console.log("Document written with ID: ", docRef.id);
})
.catch(function (error) {
console.error("Error adding document: ", error);
});
}
我不知道什么是最好的处理方式。任何帮助将不胜感激:)
答案 0 :(得分:0)
使用Firebase安全规则,您可以对Cloud Storage和Cloud Firestore实施某些要求。但是您不能在安全规则中强制它们之间建立依赖关系,因此无法验证用户放入数据库中的下载URL是否与他们刚刚上传的文件相同。
我看到一些选择:
在Cloud Functions中实现上传文件并编写文档的整个操作。因此,您将实现一个Cloud Function,该Cloud Function从用户那里获取所有必需的数据,然后写入文件和文档。这样,您可以确定编写代码总是您的代码,并且用户无法通过编写自己的代码来解决此问题。
更改写入数据库的内容。例如,如果您编写文档的路径而不是下载URL,则可以确保该文件必须存在于Cloud Storage中。您甚至可以通过检查路径是否以其UID开头,然后在Storage rules implementing user-case security中,来验证它是否位于用户特定的文件夹中。