使用 getData() 从 Firebase 存储下载 jpeg 图像时出现错误 13010“对象不存在”

Posted

技术标签:

【中文标题】使用 getData() 从 Firebase 存储下载 jpeg 图像时出现错误 13010“对象不存在”【英文标题】:Error 13010 "Object does not exist" while downloading jpeg image from Firebase storage using getData() 【发布时间】:2020-09-13 10:04:24 【问题描述】:

语言:Swift 5

iOS:13.2

ma​​cOS:Catalina 10.15.4

Firebase 存储规则:

service firebase.storage 
  match /b/bucket/o 
    match /allPaths=** 
      allow read, write: if request.auth!=null;
    
  

上传图片并保存下载地址的代码:(效果很好,因为我可以看到上传到存储的图片以及它们各自的下载地址存储到实时数据库。)

        let storageRef = Storage.storage().reference()

        //Let's upload all workout pictures
        let uploadPicsRef = 
        storageRef.child("WORKOUTDATA/USERS/"+self.UID!).child("WHITEBOARDWORKOUTS")

        let uploadNumberRef = uploadPicsRef.child("\(String(describing: workoutNum))")
        let workoutPicturesRef = uploadNumberRef.child("WORKOUTPICTURES")
        let workoutPicURLRef = workoutRef.child("WORKOUTPICTURESURL")
        var count = 0
        var picNumber = 0

        //workoutPictures list/array contains images selected from iPhone Gallery, using 
        //UIImagePickerController
        for workoutPic in self.workoutPictures
        
            let workoutPicData = workoutPic.jpegData(compressionQuality: 1.0)!
            count = count + 1
            let pictureName = "Picture\(count).jpg"

            // Upload the file to the path in pictureRef
            let pictureRef = workoutPicturesRef.child("\(pictureName)")

            let metaData = StorageMetadata()
            metaData.contentType = "image/jpg"
            pictureRef.putData(workoutPicData, metadata: metaData)  (metadata, error) in
                if error != nil 
                    print("Error while uploading image")
                
                else
                
                    pictureRef.downloadURL  (url, err) in
                        picNumber = picNumber + 1
                        workoutPicURLRef.child("Picture\(picNumber)").setValue(url?.absoluteString)
                    
                
            
        

图片下载代码:

        let myGroup = DispatchGroup()

        let workoutPicUrls = snapshot.childSnapshot(forPath: "WORKOUTPICTURESURL")

        for url in workoutPicUrls.children
        
            myGroup.enter()
            let snap = url as! DataSnapshot
            let link = snap.value as? String
            let storageRef = Storage.storage().reference()
            let pictureRef = storageRef.root().child(link!)

            DispatchQueue.main.async 
                pictureRef.getData(maxSize: 1*2000000*2000000)  (data, err) in
                if (err != nil) 
                    print(err!)
                    print(err!.localizedDescription)

                 else 
                let pic = UIImage(data: data!)
                workoutPicsArray.append(pic!)
                myGroup.leave()
                
            
            
        

错误:

错误域=FIRStorageErrorDomain 代码=-13010 "对象 https:/firebasestorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1。 jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547 不存在。” UserInfo=object=https:/firebasestorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2F5%2FWORKOUTPICTURES%2FPicture1.jpg?alt=media&token=785ab8c7- 1e08-4ad3-a542-c9e6313eb547,响应体= “错误”: “代码”:404, "message": "未找到。无法获取对象", “状态”:“GET_OBJECT” ,bucket=trainer-8cb52.appspot.com,数据=长度=115,字节=0x7b0a2020 22657272 6f72223a 207b0a20 ... 54220a20 207d0a7d,data_content_type=application/json; charset=UTF-8, NSLocalizedDescription=对象 https://firebasestorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1.jpg ?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547 不存在。, ResponseErrorDomain=com.google.HTTPStatus, ResponseErrorCode=404

到目前为止我所做的尝试:

    已检查 Firebase 存储规则。 当我在 chrome 浏览器窗口中粘贴路径 https:/firebasestorage.googleapis.com/v0/b/trainer8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1.jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547 时,会打开预期的图像。 将 maxSize 设置为一个高得离谱的数字 1*2000000*2000000。

谢谢!

【问题讨论】:

下载 URL 完全不受安全规则的影响。错误消息是说找不到您正在使用的 URL 的图像。请注意错误中的文本“不存在”。 @DougStevenson 当我粘贴 URL https:/firebasestorage.googleapis.com/v0/b/trainer8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1。 jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547 在 chrome 浏览器窗口中,预期的图像打开。如果 URL 中不存在图像,它就不会起作用,对吧?如果我在这里想错了,请纠正我。 【参考方案1】:

您是否有可能将完整的 https URL 存储在数据库中,并尝试通过将完整的 https url 作为子项添加到存储引用来创建引用?

我认为您应该尝试仅将路径和名称存储在数据库中,或者您将下载代码更改为使用 https URL。

       // Create a reference from an HTTPS URL
       // Note that in the URL, characters are URL escaped!
       let httpsReference = storage.reference(forURL: "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg")

       httpsReference.getData(maxSize: ...

您还在DispatchQueue.main.async 中运行您的getData 方法。 getData 本身有一个完成处理程序,可能需要一些时间,当您在 DispatchQueue.main.async 内运行它时,它会阻止您的代码,直到下载完成。只将更新 UI 的代码放在 DispatchQueue.main.async 中。在你的情况下,只要你对你的锻炼图片数组或 UIImage 做一些事情来更新你的视图。

看看这里,看看你是否能弄清楚你实际上是如何尝试获取数据的。在每行之后放置一个 print() 可能会有所帮助,以查看您在什么时候创建和使用了什么。

Download Files on ios

【讨论】:

马可,非常感谢您的回复。 storage.reference(forURL:"") 正是我应该使用的!它解决了我的问题。

以上是关于使用 getData() 从 Firebase 存储下载 jpeg 图像时出现错误 13010“对象不存在”的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 获取原始 JSON 到 Flutter

Firebase 不返回数据

使用React Native的Firebase查询未在我的屏幕上显示(但在console.log上显示)

网页如何防止图片被文件存为菜单

Swift:Firebase 存储代码块未执行

没有创建 Firebase 应用“[DEFAULT]” - 即使调用 Firebase.InitializeApp(),错误仍然存​​在