繁体   English   中英

尝试将图像上传到Firebase错误:类型'StorageMetadata'的值没有成员'downloadURL'-SWIFT 4

[英]Trying to upload images into Firebase error: Value of type 'StorageMetadata' has no member 'downloadURL' - SWIFT 4

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

链接到其他2个问题: 类型'StorageMetadata'的值没有成员'downloadURL'

StorageMetadata”没有成员“ 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.")
            }
        }

    }

带有以下答案的更新代码:Ive用他的解决方案替换了旧的'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.")
        }
    }

}

下载URL在metadata对象上不再可用。 上传完成后,您download URLStorageReference上调用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM