如何使用iOS Swift在Firebase Storage中上传图像阵列

时间:2020-04-12 12:19:08

标签: ios swift firebase firebase-storage

我想按用户上传图像数组 这是我将单个图像上传到Firebase存储时的代码,请参见代码:1.但是我在上传图像和数组时遇到问题。参考代码:2

代码:1

func uploadImage(image:UIImage,userId:String,completion:@escaping(_ status:Bool,_ response:String)->Void){
        // if status is true then downloadurl will be in response
        // Data in memory
        guard let data = image.jpegData(compressionQuality: 0.2) else{
            completion(false,"Unable to get data from image")
            return
        }
        // Create a reference to the file you want to upload
        let riversRef = firebaseStorage.reference().child("images/\(userId).jpg")
        // Upload the file to the path "images/rivers.jpg"
        let _ = riversRef.putData(data, metadata: nil) { (metadata, error) in
            guard let _ = metadata else{
                // Uh-oh, an error occurred!
                completion(false,error!.localizedDescription)
                return
            }
            // You can also access to download URL after upload.
            riversRef.downloadURL { (url, error) in
                guard let downloadURL = url else{
                    // Uh-oh, an error occurred!
                    completion(false,error!.localizedDescription)
                    return
                }
                completion(true,downloadURL.absoluteString)
            }
        }
    }

代码:2

func uploadPostImages(image:[UIImage],userId:String,completion:@escaping(_ status:Bool,_ response:String)->Void){
        let photoDictionary = ["postImages": PostArray.sharedInstance.photosArray as NSArray]
         // Create a reference to the file you want to upload
         let riversRef = firebaseStorage.reference().child("postImages/\(userId).jpg")
         // Upload the file to the path "images/rivers.jpg"
         let _ = riversRef.putData(photoDictionary, metadata: nil) { (metadata, error) in
             guard let _ = metadata else{
                 // Uh-oh, an error occurred!
                 completion(false,error!.localizedDescription)
                 return
             }
             // You can also access to download URL after upload.
             riversRef.downloadURL { (url, error) in
                 guard let downloadURL = url else{
                     // Uh-oh, an error occurred!
                     completion(false,error!.localizedDescription)
                     return
                 }
                 completion(true,downloadURL.absoluteString)
             }
         }
     }

我在代码2中遇到此错误

Cannot convert value of type '[String : NSArray]' to expected argument type 'Data'

能帮助我的人吗?

3 个答案:

答案 0 :(得分:1)

据我所知,这样的事情应该起作用。抱歉,我不在IDE中。如果这样不起作用,请发表评论,我会仔细看。

func uploadImages(
images:[UIImage],
userId:String,
completion:@escaping(_ status:Bool,_ response:String)->Void)
{
        images.enumerated().forEach { (index, image) in 
        guard let data = image.jpegData(compressionQuality: 0.2) else{
            completion(false,"Unable to get data from image")
            return
        }
        // Create a reference to the file you want to upload
        let riversRef = firebaseStorage.reference().child("images/\(userId)\(index).jpg")
        // Upload the file to the path "images/rivers.jpg"
        let _ = riversRef.putData(data, metadata: nil) { (metadata, error) in
            guard let _ = metadata else{
                // Uh-oh, an error occurred!
                completion(false,error!.localizedDescription)
                return
            }
            // You can also access to download URL after upload.
            riversRef.downloadURL { (url, error) in
                guard let downloadURL = url else{
                    // Uh-oh, an error occurred!
                    completion(false,error!.localizedDescription)
                    return
                }
                completion(true,downloadURL.absoluteString)
            }
         }
       }
    }

答案 1 :(得分:0)

此代码将上传图像数组

func uploadImages(images:[UIImage], userId:String, completion:@escaping(_ status:Bool, _ response:String)->Void){
    
    guard images.count <= 5 && !images.isEmpty else {return}
    
    convertImagesToData(images: images).enumerated().forEach { (index, image) in
        
        let riversRef = firebaseStorage.reference().child("userAdPostImages/\(userId)\(index).jpg")
        
        let _ = riversRef.putData(image, metadata: nil, completion: { (_ , error) in
            
            if let error = error {
                completion(true, error.localizedDescription)
                return
            }
            
            riversRef.downloadURL(completion: {(url, error) in
                
                if let error = error{
                    completion(true,error.localizedDescription)
                    return
                }
                
                guard let downloadURL = url else {return}
                completion(false,downloadURL.absoluteString)
            })
        })
    }
}

这会将您的帖子添加到Firebase中,包括数组图像

    func addPost() {
    hud.show()
    dispatchGroup.enter()
    let user = Auth.auth().currentUser
    if let user = user {
        self.userId = user.uid
    }
    let location = self.locationTextfield.text ?? ""
    let type = self.selectedType ?? ""
    let description = self.descriptionTextView.text ?? ""
    let adImages = self.adImages
    let userId = self.userId ?? ""
    let price = priceTextfield.text ?? ""
    let userName = self.userName ?? ""
    let userProfileImage = self.userProfileImage ?? ""
    let userphoneNumber = self.phoneNumber ?? ""

    ServerManager.sharedDelegate.uploadImages(images: adImages, userId: userId) { (isError, urlString) in
        
        guard !isError else {
            DispatchQueue.main.async {
                hud.hide()
            }
            return
        }
        
        self.imagePaths.append(urlString)
        print("This is the image path saved \(self.imagePaths)!!!!")
        
        if self.imagePaths.count == adImages.count {
            self.dispatchGroup.leave()
        }
    }
    dispatchGroup.notify(queue: .global(qos: .background), execute: {
        ServerManager.sharedDelegate.addPost(UserProfileImage: userProfileImage, UserName: userName, phoneNumber: userphoneNumber, adImages: self.imagePaths, Price: price, location: location, type: type, Description: description) { _ , message in
            
            DispatchQueue.main.async {
                hud.hide()
                self.vc?.view.makeToast(message)
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                    self.vc?.dismiss(animated: true, completion: nil)
                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
                }
                
            }
            return
        }
    })
}

感谢@MichaelWells的帮助,也很抱歉推迟发布答案

答案 2 :(得分:0)

您可以对字典进行编码,然后将其存储为数据:

let data = JSONEncoder().encode(photoDictionary)