Firebase 存储 downloadUrl 完成处理程序始终返回错误

Posted

技术标签:

【中文标题】Firebase 存储 downloadUrl 完成处理程序始终返回错误【英文标题】:Firebase storage downloadUrl completion handler always returns error 【发布时间】:2018-05-28 09:39:43 【问题描述】:

所以我关注documentation,但我总是收到此错误:

出现错误:用户没有访问权限 gs://***-*****.appspot.com/(null)。

图片已成功上传。唯一的问题是,当调用完成处理程序时,它返回一个错误,我无法获取图像路径。

代码如下:

func uploadImage(_ image: UIImage, completion: @escaping (String?, Error?) -> Void) 
        let filename = "\(Date().timeIntervalSince1970)"
        let imageReference = storage.child(FirestoreStorage.dishImagesPath).child(filename)

        guard let imageData = UIImageJPEGRepresentation(image, 0.8) else 
            completion(nil, CommonError.imageConversionError)
            return
        
        let metadata = StorageMetadata()
        metadata.contentType = "image/jpeg"

        imageReference.putData(imageData, metadata: metadata, completion:  [storage] (metadata, error) in
            storage.downloadURL(completion:  (url, error) in
                guard let url = url else 
                    completion(nil, error)
                    return
                
                completion(url.absoluteString, nil)
            )
        )
    

另外,这些是我的安全规则@Firebase Storage:

service firebase.storage 
   match /b/my-project.appspot.com/o 
    match /allPaths=** 
      allow read, write;
    
  

【问题讨论】:

【参考方案1】:

发生错误是因为您指向存储服务以获取下载 URL。

storage.downloadURL

您应该改为使用存储引用来获取它。

imageReference.downloadURL

【讨论】:

我只是在回答我的问题,正是你的意思。我接受我的回答并支持你的回答。干杯!【参考方案2】:

好的,所以我能够解决这个问题并在完成处理程序中获取图像路径。什么问题?就是这两行:

imageReference.putData(imageData, metadata: metadata, completion:  [storage] (metadata, error) in
    storage.downloadURL(completion:  (url, error) in

imageReference 是对图像本身的引用,storage 是对全局存储的引用。这种误解来自文档。所以它应该是这样的:

imageReference.putData(imageData, metadata: metadata, completion:  (metadata, error) in
    imageReference.downloadURL(completion:  (url, error) in

【讨论】:

以上是关于Firebase 存储 downloadUrl 完成处理程序始终返回错误的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在Java Spring Boot上的firebase存储中获取上传文件的downloadURL

将文件上传到 Firebase 存储并获取 downloadUrl。如何在 Kotlin 函数中返回结果?

如何将多个图像上传到Firebase存储并返回多个downloadURL

无法从 Flutter Firebase 中的 DocumentReference 获取 DownloadURL 或 StorageReference

如何在不更改实时数据库中的 downloadUrl 的情况下更新 android 中 Firebase 存储中的位图图像

Vuejs + Firebase Storage 将多个图像上传到 Firebase Storage 并将所有 downloadURL 推送到 Firestore