javascript - Firebase - 获取下载 URL(Firebase 存储)并将其保存在 Firebase 实时数据库中
问题描述
我一直在尝试制作仅将项目上传到 Firebase 的东西。我无法真正解释该项目,但我想做的是:
- 上传文件时获取 Firebase 下载 URL。
- 将其保存在 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");
}
为了获取下载网址,我得到了这样的回应:
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()
方法是异步的,并返回一个通过 downloadURL 解析的 Promise。
因此,您需要按照以下方式做一些事情,使用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
触发了对数据库的写入。您可以根据需要进行调整,但无论如何您只会downloadURL
在 Promise 实现时调用回调函数中的值。
推荐阅读
- python - Django中单元测试的覆盖范围是否有替代方法?
- python - 除非我 *repeat* 函数,否则代码将无法工作,这似乎是不必要的
- python - 需要河内塔的功能说明
- javascript - 尝试将图像转换为 base64 时出现 3 个错误
- excel - 有什么办法可以加快这个子程序?
- python - 发出战斗命令,但健康不减
- python - Python在闰年重复日期值以进行周数转换
- amazon-web-services - Cognito 访问令牌“cognito:groups”丢失
- gatsby - 试图将 Gatsby 站点部署到 Netlify。Netlify 可以找到一些 node_modules 文件
- angular - 无法在父 component.html 中添加第二个路由器出口以在路由中显示嵌套子级