ios - 使用 Google Firebase 同时上传多张图片

标签 ios swift firebase firebase-storage

我在 Swift iOS 项目中使用 Google Firebase。在我的应用程序的一部分中,用户可以从他们的设备中选择多于 1 张照片进行上传。我正在尝试找到将他们选择的所有照片一次上传到 Firebase 存储的最佳做法。我知道如何上传一张照片。

我查看了文档,没有看到任何关于上传多个 NSData 对象的方法,那么我是否可以运行一个 for 循环并单独上传每个图像?

谢谢!感谢所有反馈。

最佳答案

swift 3 这就是我将多张图片上传到 Firebase 的方式。我正在计算成功上传的次数,如果它等于提供的图像数量,那就是我调用完成处理程序的时间。

不确定这是否是最佳实践,但它确实有效!!

import Foundation
import Firebase
import FirebaseDatabase
import FirebaseStorage

class UploadImages: NSObject{

static func saveImages(imagesArray : [UiImage]){

        Auth.auth().signInAnonymously() { (user, error) in
            //let isAnonymous = user!.isAnonymous  // true
            //let uid = user!.uid
            if error != nil{
                print(error)
                return
            }
            guard let uid = user?.uid else{
                return
            }

            uploadImages(userId: uid,imagesArray : imagesArray){ (uploadedImageUrlsArray) in
                print("uploadedImageUrlsArray: \(uploadedImageUrlsArray)")
            }
        }
    }


static func uploadImages(userId: String, imagesArray : [UIImage], completionHandler: @escaping ([String]) -> ()){
    var storage     =   Storage.storage()

    var uploadedImageUrlsArray = [String]()
    var uploadCount = 0
    let imagesCount = imagesArray.count

    for image in imagesArray{

        let imageName = NSUUID().uuidString // Unique string to reference image

        //Create storage reference for image
        let storageRef = storage.reference().child("\(userId)").child("\(imageName).png")


        guard let myImage = image else{
            return
        }
        guard let uplodaData = UIImagePNGRepresentation(myImage) else{
            return
        }

        // Upload image to firebase
        let uploadTask = storageRef.putData(uplodaData, metadata: nil, completion: { (metadata, error) in
            if error != nil{
                print(error)
                return
            }
            if let imageUrl = metadata?.downloadURL()?.absoluteString{
                print(imageUrl)
                uploadedImageUrlsArray.append(imageUrl)

                uploadCount += 1
                print("Number of images successfully uploaded: \(uploadCount)")
                if uploadCount == imagesCount{
                    NSLog("All Images are uploaded successfully, uploadedImageUrlsArray: \(uploadedImageUrlsArray)")
                    completionHandler(uploadedImageUrlsArray)
                }
            }

        })


        observeUploadTaskFailureCases(uploadTask : uploadTask)   
    }  
} 


//Func to observe error cases while uploading image files, Ref: https://firebase.google.com/docs/storage/ios/upload-files


    static func observeUploadTaskFailureCases(uploadTask : StorageUploadTask){
        uploadTask.observe(.failure) { snapshot in
          if let error = snapshot.error as? NSError {
            switch (StorageErrorCode(rawValue: error.code)!) {
            case .objectNotFound:
              NSLog("File doesn't exist")
              break
            case .unauthorized:
              NSLog("User doesn't have permission to access file")
              break
            case .cancelled:
              NSLog("User canceled the upload")
              break

            case .unknown:
              NSLog("Unknown error occurred, inspect the server response")
              break
            default:
              NSLog("A separate error occurred, This is a good place to retry the upload.")
              break
            }
          }
        }
    }

}

用法

let arrayOfImages : [UIImage] = [Image1, Image2, Image3]
UploadImages.saveImages(imagesArray: arrayOfImages)

关于ios - 使用 Google Firebase 同时上传多张图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37769701/

相关文章:

swift - 在 Swift 中制作相同类型字典的空副本

ios - iTunes Connect 自动生成应用程序 ID

python - 在 python 中操作 Google Cloud Firestore 数据

firebase - react native : managing notification on RNFirebase

ios - 如何在 UINavigationBar 上设置图像

ios - Rails 3.2.8 + RestKit - 无需 KVC 的映射

ios - 自定义上拉刷新 Swift

android - Firebase GeoFire,检索从我当前位置到特定半径的帖子

ios - 使用 NSUrl 获取视频文件的 NSData

ios - SQLite3更新语句真的很慢