从Firebase存储中获取getDownloadURL()字符串

时间:2018-12-01 22:45:50

标签: typescript firebase ionic-framework ionic3 firebase-storage

我正在尝试获取getDownloadURL()应该返回的网址。但是实际上它会返回诸如this之类的数据。

我设法将其显示在html上,但是我的真正目的是获取URL,该URL可以在我发布的图像上看到,因此我可以获取它并将其保存在Firestore数据库中。但是我不知道如何获得该价值。 这是我的摘录:

    getImgFromServer(imgName: string): string {
    let img;
    let downloadIMG;
    img = firebase.storage().ref("/imgs/" + imgName).getDownloadURL();
    let ref= firebase.storage().ref();
    const imgRef = ref.child("/imgs/" + imgName);
    imgRef.getDownloadURL().then(function(url){
      downloadIMG=url;
      img = downloadIMG;
      console.log("MY URL " + downloadIMG)

    })
    console.log("img")
    console.log(img)
    return img
  }

调试此日志时,此代码将显示我要使用的URL:

console.log("MY URL " + downloadIMG)
  

我的网址https://firebasestorage.googleapis.com/v0/b/static-epigram-189720.appspot.com/o/imgs%2Fmovie-1543700476524.jpg?alt=media&token=5550a552-1ed0-488e-beed-a6bc82791293

但是,这是从image打印数据的:

console.log(img)

我想单独返回该URL,以便可以使用它。

  

编辑

现在,我要获取URL,我想将其保存在Cloud Firestore上,以便可以使用HTML上的URL来显示图片。 这是存储图像名称的函数:

createPublic(id,img){
this.firestore.doc(`public/${id}`).set({
     img,
    });
}

有了弗兰克给出的答案,我现在可以获得URL,所以我只用它来获取URL,并使用以下功能来更新刚上传的文档。

    async updateImg(img,idPubli){
    const imgToUpdate= await this.imgServ.getImgFromServer(img);
    this.imgServ.updateImgFromServer(imgToUpdate,idPubli)
  }

     updateImgFromServer(image,id){
      this.firestore.doc(`public/${id}`).set({
        img:image,
      });
     }

但是,它似乎不起作用。我可以想象这可能是因为在执行 updateImg()之前尚未上载图像或文档,但是我对异步函数还是有点陌生​​,所以我无法设法获得解决方案现在。

如果有帮助,这是我上传图像的功能和上传图像的功能。

 submit() {
    this.imgServ.uploadImage();
    this.viewCtrl.dismiss({data});
  }

在使用dismiss函数之后,我将收集所有数据,然后调用createPublic()函数。

 uploadImage() {
    this.image = 'movie-' + new Date().getTime() + '.jpg';
    let storageRef: any,
      parseUpload: any;
    return new Promise((resolve, reject) => {
      storageRef = firebase.storage().ref('imgs/' + this.image);
      parseUpload = storageRef.putString(this.cameraImage, 'data_url');


      parseUpload.on('state_changed', (_snapshot) => {
        // We could log the progress here IF necessary
        // console.log('snapshot progess ' + _snapshot);
      },
        (_err) => {
          reject(_err);
        },
        (success) => {
          resolve(parseUpload.snapshot);
        });
    });
  }

1 个答案:

答案 0 :(得分:0)

由于下载URL是通过调用服务器生成的,因此可能需要一些时间才能使用。而且,您不能使代码等待该值可用。这就是Package: myPackage Version: 0.1.0 Title: This is my package Author: Michael Chirico Maintainer: Michael Chirico <my_email@gmail.com> Depends: R Description: My package is great! Imports: Rcpp (>= 1.0.0) LinkingTo: Rcpp 返回承诺,然后从服务器获得下载URL后调用其getDownloadURL()的原因。该URL仅在回调中可用,因为回调后的代码在服务器返回下载URL之前(因此在调用then()回调之前运行)。

一种常见的方法是仅兑现承诺,并在需要值时使用其then()。所以:

then()

在现代环境中,替代方法是使用新的const imgRef = ref.child("/imgs/" + imgName); const downloadUrl = imgRef.getDownloadURL(); ... downloadUrl.then(function(url){ console.log("MY URL " + url) }) / async关键字。这些将上述基于诺言的方法包装在一些语法糖中:

await

然后您将其称为:

async getImgFromServer(imgName: string): string {
    let img;
    let downloadIMG;
    img = firebase.storage().ref("/imgs/" + imgName).getDownloadURL();
    let ref= firebase.storage().ref();
    const imgRef = ref.child("/imgs/" + imgName);
    const downloadURL = await imgRef.getDownloadURL()
    return downloadURL
}

另请参阅: