[英]Firebase - getting the download URL (Firebase Storage) and saving it in Firebase realtime database
我一直在尝试做一些东西,只是将项目上传到 Firebase 等等。我不能真正解释这个项目,但我想做的是:
我为它编写的代码是:
let downloadURL;
var filename = filenamechosen;
var storageRef = firebase.storage().ref('/dav' + 'projects' + '/' + filename);
var uploadTask = storageRef.put(selectedFile);
uploadTask.on("state_changed", function(snapshot){
}, function(error){
}, function(){
console.log(uploadTask.snapshot.ref.getDownloadURL());
});
};
function uploadOne(){
let projectinf = document.getElementById("projectinfo").value;
let name = document.getElementById("studentname").value;
let cls = document.getElementById("cls").value;
let email = document.getElementById("email").value;
let projectlnk = downloadURL;
let marks = document.getElementById("marks").value;
let submitfrm = document.getElementById("submitfrm");
let studentObj = {
class: cls,
email: email,
projectinfo: projectinf,
projectlink: projectlnk,
marks: "lol",
}
firebase.database().ref('/schools/dav/').child(`${name}`).set(studentObj).then().catch();
console.log("done");
}
为了获得下载 url,我得到了这样的回应:
jt {a: 0, i: undefined, c: jt, b: null, f: null, …}
a: 2
b: null
c: null
f: null
g: false
h: false
i: "https://firebasestorage.googleapis.com/v0/b/workspace-c7042.appspot.com/o/davproject.... //Continues
在下载 URL 后,我不知道如何将其存储在 Firebase 实时数据库中:
<form action="uploadOne()">
<!--Some inputs as defined in the uploadOne function.-->
<button type="submit">SUBMIT</button>
</form>
这几乎是我在那个东西上使用的整个形式。
getDownloadURL()
方法是异步的,它返回一个 Promise ,它使用 downloadURL 解析。
因此,您需要执行以下操作,使用then()
方法等待 Promise 解析:
uploadTask.snapshot.ref.getDownloadURL().then(function(downloadURL) {
console.log('File available at', downloadURL);
});
您的代码中不清楚这两个不同部分是如何链接的(哪一个调用哪个以及如何选择文件),但一种可能性如下所示:
let downloadURL;
var filename = filenamechosen;
var storageRef = firebase.storage().ref('/dav' + 'projects' + '/' + filename);
var uploadTask = storageRef.put(selectedFile);
uploadTask.on("state_changed",
null, /// <- See https://firebase.google.com/docs/reference/js/firebase.storage.UploadTask#on
null,
function(){
// Upload completed successfully, now we can get the download URL
uploadTask.snapshot.ref.getDownloadURL()
.then(function(downloadURL) {
console.log('File available at', downloadURL);
uploadOne(downloadURL); // <- We call the uploadOne function passing the downloadURL as parameter
});
});
function uploadOne(downloadURL){
let projectinf = document.getElementById("projectinfo").value;
let name = document.getElementById("studentname").value;
let cls = document.getElementById("cls").value;
let email = document.getElementById("email").value;
let projectlnk = downloadURL;
let marks = document.getElementById("marks").value;
let submitfrm = document.getElementById("submitfrm");
let studentObj = {
class: cls,
email: email,
projectinfo: projectinf,
projectlink: projectlnk,
marks: "lol",
}
firebase.database().ref('/schools/dav/').child(`${name}`).set(studentObj)
.then(function() {
console.log("done");
})
.catch(function(error) {
console.log(error);
});
}
这样,触发写入数据库的是uploadTask
。 您可以根据需要进行调整,但无论如何您只会在 Promise 完成时调用的回调 function 中获得downloadURL
的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.