Firebase成功上传到firebase存储后获取下载URL

时间:2017-08-16 12:49:46

标签: javascript angular firebase firebase-realtime-database firebase-storage

我正在尝试将单个图片上传到Firebase存储,然后获取其下载网址并将其分配给变量。

我可以成功将我的图片上传到firebase,但是我无法检索下载网址。这是我已经尝试过的。

upload() {
    let storageRef = firebase.storage().ref();
    let success = false;

    for (let selectedFile of [(<HTMLInputElement>document.getElementById('file')).files[0]]) {
      let router = this.router;
      let af = this.af;
      let folder = this.folder;
      let path = `/${this.folder}/${selectedFile.name}`;
      var iRef = storageRef.child(path);
      iRef.put(selectedFile).then((snapshot) => {
        console.log('Uploaded a blob or file! Now storing the reference at', `/${this.folder}/images/`);
        af.list(`/${folder}/images/`).push({ path: path, filename: selectedFile.name })
      });
    }

    // This part does not work
    iRef.getDownloadURL().then((url) => {this.image = url});
    console.log('IREF IS ' + iRef)
    console.log('IMAGEURL IS ' + this.image)

  }

控制台日志如下:

    IREF IS gs://my-app-159520.appspot.com/images/Screen Shot 2017-08-14 at 12.19.01.png
    view-order.component.ts:134 IMAGEURL IS undefined
Uploaded a blob or file! Now storing the reference at /images/images/

我一直在尝试使用iRef参考来获取下载网址,但我一直在收到错误。我正在尝试获取URL,以便将其分配给this.image变量,然后使用其他函数将其存储在我的数据库中。

4 个答案:

答案 0 :(得分:6)

API已更改。使用以下内容获取downloadURL

  snapshot.ref.getDownloadURL().then(function(downloadURL) {
    console.log("File available at", downloadURL);
  });

答案 1 :(得分:4)

我想我已经想到这个并且它似乎正在工作,我意识到我必须从快照中获取downloadURL并将其分配给this.image,如下所示:

upload() {
    let storageRef = firebase.storage().ref();
    let success = false;

    for (let selectedFile of [(<HTMLInputElement>document.getElementById('file')).files[0]]) {
      let router = this.router;
      let af = this.af;
      let folder = this.folder;
      let path = `/${this.folder}/${selectedFile.name}`;
      var iRef = storageRef.child(path);
      iRef.put(selectedFile).then((snapshot) => {

        // added this part which as grabbed the download url from the pushed snapshot
        this.image = snapshot.downloadURL;

        console.log('Uploaded a blob or file! Now storing the reference at', `/${this.folder}/images/`);
        af.list(`/${folder}/images/`).push({ path: path, filename: selectedFile.name })

        console.log('DOWNLOAD URL IS ' + this.image)
      });
    }

  }

然后我运行了我的其他功能,将URL添加到数据库中,并且在预期的地方已经进入正常状态!

所以我已经将图像上传到数据库,然后使用put函数中的快照,然后我分配了我的变量图像:any to to snapshot downloadURL,如下所示:

this.image = snapshot.downloadURL;

我希望这可以帮助别人!

答案 2 :(得分:3)

.put()函数正在返回任务,该任务可用于跟踪上传状态。

例如,您可以像这样监听进度,错误或完成情况:

onUploadImage () {
  const self = this
  const file = self.selectedFile
  if (!file) {
    return
  }
  self.isUploading = true
  const storageRef = firebase.storage().ref('/images/' + file.name)
  const task = storageRef.put(file)
  task.on('state_changed',
    function progress (snapshot) {
      self.status = 'UPLOADING...'
      self.percentage = (snapshot.bytesTransferred / snapshot.totalBytes) * 100
    },
    function error () {
      self.status = 'FAILED TRY AGAIN!'
      self.isUploading = false
    },

    function complete (event) {
      self.status = 'UPLOAD COMPLETED'
      self.isUploading = false
      storageRef.getDownloadURL().then((url) => { console.log(url) })
    }
  )
}

答案 3 :(得分:0)

2019年,我使用以下功能访问了Firebase中新保存的文件的网址:

const uploadImage = async(uri) => {
  const response = await fetch(uri);
  const blob = await response.blob();
  // child arg specifies the name of the image in firebase
  const ref = firebase.storage().ref().child(guid());
  ref.put(blob).then(snapshot => {
    snapshot.ref.getDownloadURL().then(url => {
      console.log(' * new url', url)
    })
  })
}
相关问题