[英]SwiftUI: upload multiple images to Firebase
Goal: upload 3 images from SwiftUI app to Firebase, with different URL for each.目标:从SwiftUI app上传3张图片到Firebase,每张不同的URL。
Problem: I only managed to upload 1.问题:我只上传了 1 个。
What I have tried (but didn't work).... :我尝试过的(但没有用)......:
storagePostRef.putData(image1, image2, image3, metadata: metadata) { (storageMetadata, error) in
Full function bellow:完整的 function 波纹管:
static func savePostPhoto(
//id
userId: String,
image1: Data,
image2: Data,
image3: Data,
// imagesArray : [Data],
metadata: StorageMetadata,
storagePostRef: StorageReference,
onSuccess: @escaping() -> Void,
onError: @escaping(_ errorMessage: String) -> Void)
{
let arrayOfImages : [Data] = [image1, image2, image3]
//image storage
storagePostRef.putData(image1, metadata: metadata) { (storageMetadata, error) in
if error != nil {
onError(error!.localizedDescription)
return
}
//image URL
storagePostRef.downloadURL { (url, error) in
let image1 = url?.absoluteString
let image2 = url?.absoluteString
let image3 = url?.absoluteString
}
}
}
Each call to putData
stores a single image, in the location that you call putData
on.每次调用
putData
都会在调用putData
的位置存储一个图像。
So if you want to store three separate images, you'll have to call putData
on three difference StorageReference
objects.因此,如果要存储三个单独的图像,则必须在三个不同的
StorageReference
对象上调用putData
。 To then get the three download URLs, you call downloadURL
on each of the three StorageReference
objects too.然后,要获取三个下载 URL,您还要对三个
StorageReference
对象中的每一个调用downloadURL
。
storagePostRef1.putData(image1, metadata: metadata) { (storageMetadata, error) in
storagePostRef1.downloadURL { (url1, error) in
let image1 = url?.absoluteString storagePostRef2.putData(image2, metadata: metadata) { (storageMetadata, error) in
storagePostRef2.downloadURL { (url2, error) in
storagePostRef3.putData(image3, metadata: metadata) { (storageMetadata, error) in
storagePostRef3.downloadURL { (url3, error) in
You can probably clean this up a bit, by creating your own helper function that handles the calls to putData
and downloadUrl
with a single closure/callback.您可以通过创建自己的帮助程序 function 来稍微清理一下,该帮助程序通过单个闭包/回调处理对
putData
和downloadUrl
的调用。
This works pretty well.这很好用。
var photoArrayModel = PhotoArrayModel(photoArray: [])
let userPhotosFirstoreRef = self.ref.document(uid)
imagesData.enumerated().forEach { index, imageData in
let userPhotosStorageRef = self.storageRoot.child("user_photos").child(uid).child("image_\(index)")
userPhotosStorageRef.putData(imageData, metadata: nil) { metaData, error in
if error != nil {
promise(.failure(.uploadingPhoto))
}
userPhotosStorageRef.downloadURL { url, error in
if error != nil {
promise(.failure(.uploadingPhoto))
}
guard let urlString = url?.absoluteString else { return promise(.failure(.uploadingPhoto))}
let photo = PhotoModel(ownerID: uid, imageURL: urlString, timeStamp: Date().millisecondsSince1970)
photoArrayModel.photoArray.append(photo)
if photoArrayModel.photoArray.count == imagesData.count {
do {
try userPhotosFirstoreRef.setData(from: photoArrayModel.self)
promise(.success(()))
} catch {
promise(.failure(.uploadingPhoto))
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.