簡體   English   中英

無法在 Firebase 存儲上獲取上傳圖片的網址

[英]Not able to get the url of uploaded image on firebase storage

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";

}

之后,當我嘗試獲取上傳圖像的下載網址時<我收到上述錯誤(錯誤:無法檢索下載網址)。

問題是什么? 我在這里錯過了什么嗎?

經過幾個小時的反復試驗,終於得到了解決方案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM