如何从 getDownloadURL() 获取 url

Posted

技术标签:

【中文标题】如何从 getDownloadURL() 获取 url【英文标题】:How to obtain the url from getDownloadURL() 【发布时间】:2019-05-21 12:32:23 【问题描述】:

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

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

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

但是我可以看到网址在列表中

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

那么现在如何获取这个url呢?

.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
  )
)

【问题讨论】:

【参考方案1】:

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

Phil 也是正确的,keyimageUrl 都不会在您的最终 then() 中定义。

如此组合,您可能需要:

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
  )
)

【讨论】:

感谢您的帮助!但是我仍然很难让它发挥作用!这是我的 github 存储库和 firebase 上的实时站点......你有没有机会看看我做错了什么??? github.com/dothecoolwip/help2hikersmeetup.firebaseapp.com 原来我实际上无法从代码中获取 KEY ......我迷失了如何获取它,请帮助。大声笑 抱歉,我们可以在 repo 中添加大量代码来有效地提供帮助,这就是为什么 Stack Overflow 在您创建 minimal, complete, self-contained example 时效果最好的原因。例如:您问题中的代码没有显示在第一个 then 之前发生了什么,因此我们无法知道密钥的含义,也不知道它应该来自哪里。【参考方案2】:

在您的第二个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
)

【讨论】:

感谢您的帮助!但是我仍然很难让它发挥作用!这是我的 github 存储库和 firebase 上的实时站点......你有没有机会看看我做错了什么??? github.com/dothecoolwip/help2hikersmeetup.firebaseapp.com

以上是关于如何从 getDownloadURL() 获取 url的主要内容,如果未能解决你的问题,请参考以下文章

在回调中在firebase上上传两个文件但无法获取两个文件的getDownloadUrl

为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL

Firebase getDownloadURL() 在获取图片 URL 时真的很慢

使用 getDownloadURL() 从 firebase 存储加载图像不起作用

Flutter : getDownloadUrl (firebase 存储)

如何在最新版本中使用 getdownloadurl?