为了账号安全,请及时绑定邮箱和手机立即绑定

获取下载 URL(Firebase 存储)并将其保存在 Firebase 实时数据库中

获取下载 URL(Firebase 存储)并将其保存在 Firebase 实时数据库中

白猪掌柜的 2021-12-23 16:07:45
我一直在尝试制作一些东西,它只是将一个项目上传到 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");}为了获取下载 url,我收到了这样的回复:jt {a: 0, i: undefined, c: jt, b: null, f: null, …}a: 2b: nullc: nullf: nullg: falseh: falsei: "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>这几乎是我与那件事一起使用的整个形式。
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

该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 实现时调用的回调函数中获得 的值。


查看完整回答
反对 回复 2021-12-23
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信