当前位置: 首页 > 知识库问答 >
问题:

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

童铭晨
2023-03-14

语言:Swift 5

监督办:13.2

MacOS:Catalina 10.15.4

Firebase存储规则:

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

上传图像和保存下载URL的代码:(这工作很好,因为我可以看到图像上传到存储区,它们各自的下载URL存储到实时数据库。)

        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%2fworkoutpicts%2fpicture1.jpg?alt=介质&标记=785ab8c7-1e08-4ad3-a542-c9e6313eb547不存在。”userinfo={object=https:/firebaseStorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/workoutdata%2fusers%2f1k7wv1alyiewpasfc6ymojkpfsj1%2fwhiteboardworkouts%2f5%2fworkoutpicts%2fpicture1.jpg?alt=介质&标记=785ab8c7-1e08-4ad3-a542-c9e6313eb547,responsebody={“错误”:{“代码”:404,“消息”:“找不到.

到目前为止我所尝试的:

  1. 检查了firebase存储规则。
  2. 当我在chrome浏览器窗口中粘贴路径https://firebasestorage.googleapis.com/v0/b/trainer8cb52.appspot.com/o/workoutdata%2fusers%2f1k7wv1alyiewpasfc6ymojkpfsj1%2fwhiteboardworkouts%2f5%2fworkoutpicts%2fpicture1.jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547时,将打开预期的图像。
  3. 将maxSize设置为高得离谱的数字1*2000000*2000000。

谢谢!

共有1个答案

秦雅逸
2023-03-14

您是否可能将完整的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中。在您的情况下,只要您对workoutPicsArray或UIImage执行某些操作以更新视图,就可以立即执行。

看一下这里,看看你是否能弄清楚你实际上是如何尝试获取数据的。在每一行后面加上一个print()可能会有帮助,以查看您在什么地方创建和使用了什么内容。

在iOS上下载文件

 类似资料:
  • 我已经尝试了StackOverflow上发布的所有解决方案,但我的问题没有在那里讨论,所以我提出了这个问题。在我的例子中,图像被上传到firebase存储桶中,但没有在firestore中插入新记录,因此发生了此错误。我的代码:- 存储数据函数如下所示:-

  • 我想在firebase存储中上载图像。我知道如何使用Uri在firebase中上传图像。但是有没有一种方法可以让我使用链接将图像上传到firebase? 我在我的项目中使用了一个API,我每月只能点击1000次,所以我试图在firebase中保存从API获取的图像。API提供了一个指向图像的链接,我使用它在Picasso的imageview中显示图像。 假设我的链接是http://xxx.xx.x

  • 我试图用Java从Firebase存储下载一个图像到android studio应用程序的imageView中。我已经浏览了stackoverflow超过6个小时,所以我很可能读到了任何“类似”的问题。我已经尝试了各种方法,但最多的建议和似乎是最简单的是使用滑翔。我无法让它工作,也找不到错误。我甚至在一个普通的谷歌图片链接尝试,它仍然显示空白。 我用过的代码 我也试过这个代码 而这个代码 给出lo

  • 以下是我的上传代码: 编辑:我将base64字符串复制到一个在线转换器中,看起来不错,它返回了正确的图像。看起来,数据没有问题。firebase的处理方式有问题。 编辑:我尝试显式地将类型设置为image/jpeg而不是image/jpg,如下所述:当Firestorage关闭时显示图像的正确方式,或者在Firestorage for iOS中加载预览时出错,但没有区别。

  • 我有一个按钮,它向用户提供选择,他是否想要从画廊或相机的图像。当用户从图库拍摄图像时,我能够成功地将图像上传到Firebase存储,但是当用户选择相机时,我无法将图像上传到存储。这是用户选择相机时的onActivityResult代码 它将图像上传到我的imageview,但给我错误提示 当我尝试上载到存储时 我在stack overflow上遇到了一个类似的问题。 我认为公认的答案是错误的,因为