【问题标题】:Not able to get the url of uploaded image on firebase storage无法在 Firebase 存储上获取上传图片的网址
【发布时间】:2021-01-13 18:15:55
【问题描述】:
class FCMStorage {

var storage: Storage!

init() {
    storage = Storage.storage()
}

func storeImage(data: Data?, name: String, completion: @escaping ((String?, Error?)->Void)) {

    guard let data = data else {
        return
    }
    let metaData = StorageMetadata()
    metaData.contentType = "image/jpeg"
    let path = "images/" + name
    print("img to store = \(path)")
    let ref = storage.reference()
    let uploadTask = ref.child(path).putData(data, metadata: metaData) { (metadata, error) in
        
        if error == nil {
            print(metadata as Any)
            ref.downloadURL(completion: { (url, error) in
                completion(url?.absoluteString, error)
            })
        } else {
            print("storeImage error: \(error!)")
        }

    }
    
    uploadTask.observe(.progress) { (snapshot) in
        print((snapshot.progress?.fractionCompleted ?? 0) * 100.0)
        if snapshot.status == .success || snapshot.status == .failure {
            uploadTask.removeAllObservers(for: .progress)
        }
    }
 }
}

使用able类,我可以成功地将图像上传到firebase,我也可以在firebase上看到上传的图像但是......

当我调用 downloadURL() 方法时,它总是给我以下错误

ref.downloadURL(completion: { (url, error) in
   completion(url?.absoluteString, error)
})

错误:无法检索下载 URL。

任何人都可以帮助我解决这个问题!

编辑

当我打印文件的元数据时,它会打印以下内容......

FIRStorageMetadata 0x283f99860:{

bucket = "sportoilic.appspot.com";

contentDisposition = "inline; filename*=utf-8''8E13A816-FAF1-47ED-8F84-94BBB8C4C77F";

contentEncoding = identity;

contentType = "application/octet-stream";

generation = 1601287237056536;

md5Hash = "VgMH6NMPGJT//LCD8goaDA==";

metageneration = 1;

name = "8E13A816-FAF1-47ED-8F84-94BBB8C4C77F";

size = 114787;

timeCreated = "2020-09-28T10:00:37.056Z";

updated = "2020-09-28T10:00:37.056Z";

}

然后当我尝试获取上传图片的下载网址时

有什么问题?我在这里遗漏了什么吗?

【问题讨论】:

    标签: ios swift firebase-storage


    【解决方案1】:

    经过几个小时的反复试验,终于得到了解决方案。

    class FCMStorage {
    
    var ref: StorageReference!
    
    init(path: String) {
        ref = Storage.storage().reference(withPath: path)
        print("img to store at path = \(path)")
    }
    
    func storeImage(data: Data?, completion: @escaping ((String?, Error?)->Void)) {
    
        guard let data = data else {
            return
        }
        
        let uploadTask = ref.putData(data, metadata: nil) { (metadata, error) in
            
            if error == nil {
                print(metadata as Any)
                
                self.ref.downloadURL(completion: { (url, error) in
                    completion(url?.absoluteString, error)
                })
            } else {
                print("storeImage error: \(error!)")
            }
    
        }
        
        uploadTask.observe(.progress) { (snapshot) in
            print((snapshot.progress?.fractionCompleted ?? 0) * 100.0)
            if snapshot.status == .success || snapshot.status == .failure {
                uploadTask.removeAllObservers(for: .progress)
            }
        }
      }
    }
    

    所以存储图像只需要这样调用...

      let path = "images/" + UUID().uuidString
        FCMStorage(path: path).storeImage(data: data) { (imgUrl, error) in
                    
              if let strUrl = imgUrl, error == nil {
                 FCMDatabase.init(OfTable: .chatRooms).setImageUrl(strUrl: strUrl, teamId: self.team?.id ?? 0, forMsgId: self.arrChats.last?.messageId ?? "") { (isDone) in
                            
                    if isDone {
                             print("Image url set in database")
                            }
                        }
                    } else {
                        print("Error: \(error?.localizedDescription ?? "Error while getting image url")")
                    }
          }
    

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2021-08-18
      • 2022-09-25
      • 1970-01-01
      • 2017-09-21
      • 2021-11-21
      • 2016-11-28
      相关资源
      最近更新 更多