如何从getDownloadURL()获取url

时间:2018-12-21 00:57:27

标签: firebase vue.js firebase-realtime-database firebase-storage

我尝试了所有可能找到的途径,找到了很多解决方案,但似乎没有一个适合我的应用程序!

我已经到了可以将照片与所有其他信息成功上传到Firebase的地步,但是当我尝试检索已上传文件的URL时,它会一直说

  

Reference.child失败:第一个参数是无效路径=“未定义”。路径必须是非空字符串,并且不能包含“。”,“#”,“ $”,“ [”或“]”

但是我可以看到url在列表中

{a: 0, i: undefined, c: A, b: null, f: null, …}
a: 2
b: null
c: null
f: null
g: false
h: false
i: "https://firebasestorage.googleapis.com/v0/b/hikershangout.appspot.com/o/hangouts%2F-LUDFPpNTBdAdmUu_gLW..jpg?alt=media&token=cffdd574-1b9d-426e-a078-8d18ca5bdf7f"
__proto__: Object

那么现在如何获取此网址?

.then (key => {
  const filename = payload.image.name
  const ext = filename.slice(filename.lastIndexOf('.'))
  return firebase.storage().ref('hangouts/' + key + '.' + ext).put(payload.image)
})
.then(fileData => {
  imageUrl = fileData.ref.getDownloadURL()
  console.log(imageUrl)
  return firebase.database().ref('hangouts').child(key).update({imageUrl: imageUrl})
})
.then(() => {
  commit('createHangout', {
    ...hangout,
    imageUrl: imageUrl,
    id: key
  })
})

2 个答案:

答案 0 :(得分:1)

在您的第二个then()中,key未定义,但是您尝试在child(key)中使用它。

我建议合并前两个then()块,以便您可以使用所需的一切。例如

.then (key => {
  const filename = payload.image.name
  const ext = filename.slice(filename.lastIndexOf('.'))
  return firebase.storage().ref('hangouts/' + key + '.' + ext).put(payload.image).then(fileData => {
    const imageUrl = fileData.ref.getDownloadURL()
    console.log(imageUrl)
    return firebase.database().ref('hangouts').child(key).update({ imageUrl })
  })
}).then(() => {
  commit(...)
  // etc
})

答案 1 :(得分:0)

大约半年前,getDownloadUrl()不再立即返回下载URL,而是返回一个以下载URL解析的承诺。

Phil也很正确,在最终的key中都不会定义imageUrlthen()

因此,您可能需要:

var key, imageUrl;

...
.then (key => {
  const filename = payload.image.name
  const ext = filename.slice(filename.lastIndexOf('.'))
  this.key = key;
  return firebase.storage().ref('hangouts/' + key + '.' + ext).put(payload.image)
})
.then(fileData => {
  return fileData.ref.getDownloadURL()
}).then((imageUrl) => {
  console.log(imageUrl)
  this.imageUrl = imageUrl;
  return firebase.database().ref('hangouts').child(key).update({imageUrl: imageUrl})
})
.then(() => {
  commit('createHangout', {
    ...hangout,
    imageUrl: imageUrl,
    id: key
  })
})