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

时间:2018-08-16 23:50:33

标签: ios swift firebase firebase-storage

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

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

StorageMetadata' has no member 'downloadURL'

short

更新后的代码如下: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: 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.")
            }
        }

    }

1 个答案:

答案 0 :(得分:3)

下载URL在metadata对象上不再可用。相反,您需要在上传完成后在download URL上致电StorageReference

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