【问题标题】:Trying to upload images into Firebase error: Value of type 'StorageMetadata' has no member 'downloadURL' - SWIFT 4尝试将图像上传到 Firebase 错误:“StorageMetadata”类型的值没有成员“downloadURL”-SWIFT 4
【发布时间】:2018-08-16 23:50:32
【问题描述】:

我知道还有 2 个类似这个问题的其他问题(链接如下),我已经尝试了几个小时试图为我的代码应用解决方案,但没有成功。我正在尝试为我的应用程序构建后端,并希望将多张图片作为一个“帖子”上传到 Firebase,就像 Instagram 的功能一样。下面的代码是我的 ImageUploadManager 女巫,旨在为我的练习项目以“一篇文章中的多个图像”的方式处理上传到 Firebase 的照片。

其他 2 个问题的链接: Value of type 'StorageMetadata' has no member 'downloadURL'

StorageMetadata' has no member 'downloadURL'

    import UIKit
    import FirebaseStorage
    import Firebase

    struct Constants {

        struct Car {
            static let imagesFolder: String = "carImages"
        }

    }

    class ImageUploadManager: NSObject {
                                    //Below code (comented out) is for completion progress visual
        func uploadImage(_ image: UIImage, /**/ progressBlock: @escaping (_ percentage: Double) -> Void, /**/ completionBlock: @escaping (_ url: URL?, _ errorMessage: String?) -> Void) {
            let storage = Storage.storage()
            let storageReference = storage.reference()

            //storage/carImages/{customId}/image.jpg
            let imageName = "\(Date().timeIntervalSince1970).jpg"
            let imagesReference = storageReference.child(Constants.Car.imagesFolder).child(imageName)

            if let imageData = UIImageJPEGRepresentation(image, 0.8) {
                let metadata = StorageMetadata()
                metadata.contentType = "image/jpg"

                let uploadTask = imagesReference.putData(imageData, metadata: metadata, completion: { (metadata, error) in
                //Lines below may also be for progress bar not sure
                    if let metadata = metadata {
 //Error here           completionBlock(metadata.downloadURL(), nil)
                    } else {
                        completionBlock(nil, error?.localizedDescription)
                    }
                    //ends here
                })
                uploadTask.observe(.progress, handler: { (snapshot) in
                    //Below lines for Progress bar on upload
                    guard let progress = snapshot.progress else {
                        return
                    }

                    let percentage = (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) * 100
                    progressBlock(percentage)
                    //Ends here
                })
            } else {
                completionBlock(nil, "Image could not be converted to Data.")
            }
        }

    }

更新后的代码,答案如下:我已经用他的解决方案替换了我的旧 'let uploadTask = '

import UIKit
import FirebaseStorage
import Firebase

struct Constants {

    struct Car {
        static let imagesFolder: String = "carImages"
    }

}

class ImageUploadManager: NSObject {
                                //Below code (comented out) is for completion progress visual
    func uploadImage(_ image: UIImage, /**/ progressBlock: @escaping (_ percentage: Double) -> Void, /**/ completionBlock: @escaping (_ url: String?, _ errorMessage: String?) -> Void) {
        let storage = Storage.storage()
        let storageReference = storage.reference()

        //storage/carImages/{customId}/image.jpg
        let imageName = "\(Date().timeIntervalSince1970).jpg"
        let imagesReference = storageReference.child(Constants.Car.imagesFolder).child(imageName)

        if let imageData = UIImageJPEGRepresentation(image, 0.8) {
            let metadata = StorageMetadata()
            metadata.contentType = "image/jpg"

            //        let storageRef = Storage.storage().reference().child("profile_images").child("\(imageName).png")

            let uploadTask = imagesReference.putData(imageData, metadata: metadata, completion: { (metadata, error) in
                if let metadata = metadata {
                    imagesReference.downloadURL { (url, error) in
                        guard let downloadURL = url else {
                            // Uh-oh, an error occurred!
                            return
                        }
                    }
                    completionBlock(downloadURL, nil)
                } else {
                    completionBlock(nil, error?.localizedDescription)
                }
            })
            uploadTask.observe(.progress, handler: { (snapshot) in
                guard let progress = snapshot.progress else {
                    return
                }

                let percentage = (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) * 100
                progressBlock(percentage)

            })
        } else {
            completionBlock(nil, "Image could not be converted to Data.")
        }
    }

}

【问题讨论】:

    标签: ios swift firebase firebase-storage


    【解决方案1】:

    metadata 对象上不再提供下载 URL。而是在上传完成后调用StorageReference 上的download URL

    let uploadTask = imagesReference.putData(imageData, metadata: metadata, completion: { (metadata, error) in
        if let metadata = metadata {
            imagesReference.downloadURL { (url, error) in
                guard let downloadURL = url else {
                    // Uh-oh, an error occurred!
                    return
                }
            }
            completionBlock(downloadURL, nil)
        } else {
            completionBlock(nil, error?.localizedDescription)
        }
    })
    

    请注意,这是文档的直接副本,因此我建议您也多研究一下:https://firebase.google.com/docs/storage/ios/upload-files#upload_from_data_in_memory

    【讨论】:

    • 感谢您的回答,我用您发送的代码替换了我的 'let uploadTask = imagesReference.putData(imageData, ....etc',但现在我收到此错误" Use of unresolved identifier 'downloadURL '" ,我是否错误地实施了您的解决方案?和/或我该如何解决这个问题?提前致谢!
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多