使用 Google Firebase 同时上传多张图片
Posted
技术标签:
【中文标题】使用 Google Firebase 同时上传多张图片【英文标题】:Uploading Multiple Images simultaneously with Google Firebase 【发布时间】:2016-10-12 16:31:23 【问题描述】:我在 Swift ios 项目中使用 Google Firebase。我的应用程序中有一部分用户从他们的设备中选择了多张照片进行上传。我正在尝试找到将他们一次选择的所有照片上传到 Firebase 存储的最佳做法。我知道如何上传一张照片。
我查看了文档并没有看到任何关于上传多个 NSData 对象的方法,所以我是否只需运行一个 for 循环并单独上传每个图像?
谢谢!感谢所有反馈。
【问题讨论】:
您确实只是循环并单独上传它们。如果您一次上传一张,您的 iOS 用户也可能会很感激,这样他们就可以在中途中止上传,而不会丢失所有图像的进度。 @FrankvanPuffelen,您能否提供一些示例代码来说明这是如何完成的?我们应该实现像 promiseKit 这样的第三方库来实现这一点吗? github.com/mxcl/PromiseKit 【参考方案1】:斯威夫特 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)
【讨论】:
既然是循环的,这不是在创建后台线程,而且完成处理程序返回时可能没有所有下载的URL?【参考方案2】:@FrankVanPuffellen 在 cmets 中回答...
“您确实只需循环并单独上传它们。如果您一次上传一张,您的 iOS 用户也可能会很感激,这样他们就可以在中途中止上传,而不会丢失所有图像的进度。” ——弗兰克·范·普菲伦
【讨论】:
如果一次上传一个,可能需要更长的时间;特别是你有视频要上传。我唯一想到的就是先压缩它们,作为单个文件上传,然后通过服务器端的函数解压缩。以上是关于使用 Google Firebase 同时上传多张图片的主要内容,如果未能解决你的问题,请参考以下文章
React Native Firebase 多张图片上传问题
将多张图片上传到 Firebase 并检索到 viewpage
Firebase 上传多个 Storage/Firestore