Ошибка 13010 «Объект не существует» при загрузке изображения jpeg из хранилища Firebase с помощью getData () - PullRequest
1 голос
/ 26 мая 2020

Язык : Swift 5

iOS: 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 Code = -13010 "Объект https: /firebasestorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1JFCYIeje % 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%2FWHITE%WPAsFC6YMoJKPFSj1%2FWHITE%ICOT%8BOARD2URPG2PGPG2_FWHITEBOARD2URPGPG2PG2_WHITEBOARD_BOARDWORK5_Media2 1e08-4ad3-a542-c9e6313eb547, ResponseBody = {"error": {"code": 404, "message": "Not Found. Не удалось получить объект", "status": "GET_OBJECT"}}, bucket = trainer- 8cb52.appspot.com, data = {length = 115, bytes = 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%2F1K7WV1alYIeWPAsFC6YMoJKWPGWPAsFC6YMoJKWPGWPAsFC6YMoJKPORJPG.jpg ? alt = media & token = 785ab8c7-1e08-4ad3-a542-c9e6313eb547 не существует., ResponseErrorDomain = com.google.HTTPStatus, ResponseErrorCode = 404}

Что я пробовал пока:

  1. Проверенные правила хранения firebase.
  2. Когда я вставляю путь 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 окно браузера, открывается ожидаемое изображение.
  3. Установите maxSize на смехотворно высокое число 1 * 2000000 * 2000000.

Спасибо!

1 Ответ

0 голосов
/ 26 мая 2020

Возможно ли, что вы храните полный URL-адрес https в базе данных и пытаетесь создать ссылку, добавляя полный URL-адрес https в качестве дочернего элемента к ссылке на хранилище?

Я думаю, вам следует попробовать либо сохраните только путь и имя в своей базе данных, либо измените код загрузки, чтобы использовать URL-адрес https.

       // 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: ...

Также вы запускаете метод getData внутри DispatchQueue.main.async. getData имеет обработчик завершения и может занять некоторое время, когда вы запустите его внутри DispatchQueue.main.async, он заблокирует ваш код до тех пор, пока загрузка не будет завершена. Поместите только код, обновляющий пользовательский интерфейс, внутри DispatchQueue.main.async. В вашем случае, как только вы сделаете что-то с помощью workoutPicsArray или UIImage, чтобы обновить свое представление.

Посмотрите здесь, чтобы узнать, сможете ли вы выяснить, как вы на самом деле пытаетесь получить данные. Было бы полезно поставить print () после каждой строки, чтобы увидеть, что вы создаете и в какой момент используете.

Загрузите файлы на iOS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...