我只想使用swift在firebase上上传多个图像。我现在正在上传一张图片,但无法上传多张图片。这是我的代码
let photoIdString = NSUUID().uuidString
let storageRef = Storage.storage().reference(forURL: Config.STORAGE_ROOF_REF).child("posts").child(photoIdString)
storageRef.putData(imageData, metadata: nil,completion: {(metadata,error) in
if error != nil {
return
}
let photoUrl = metadata?.downloadURL()?.absoluteString
let ref = Database.database().reference()
let postReference = ref.child("posts")
let newPostId = postReference.childByAutoId().key
let newPostReference = postReference.child(newPostId)
newPostReference.setValue(["photoUrl":photoUrl,"caption":self.textView.text!])
当前没有直接API可以批量上传/下载文件。我们不能使用循环,因为所有任务都执行asynchronously
。我们可以做的是使用递归函数。
核心逻辑
let images = [image1, image2, image3, image4]
func uploadImage(forIndex index: Int) {
if index < images.count {
/// Perform uploading
/// After successfully uploading call this method again by increment the **index = index + 1**
return;
}
/// All images have been uploaded successfully
}
完整代码示例
1.我创建了一个自定义类来上传文件
import UIKit
import Firebase
class FirFile: NSObject {
/// Singleton instance
static let shared: FirFile = FirFile()
/// Path
let kFirFileStorageRef = Storage.storage().reference().child("Files")
/// Current uploading task
var currentUploadTask: StorageUploadTask?
func upload(data: Data,
withName fileName: String,
block: @escaping (_ url: String?) -> Void) {
// Create a reference to the file you want to upload
let fileRef = kFirFileStorageRef.child(fileName)
/// Start uploading
upload(data: data, withName: fileName, atPath: fileRef) { (url) in
block(url)
}
}
func upload(data: Data,
withName fileName: String,
atPath path:StorageReference,
block: @escaping (_ url: String?) -> Void) {
// Upload the file to the path
self.currentUploadTask = path.putData(data, metadata: nil) { (metaData, error) in
let url = metaData?.downloadURL()?.absoluteString
block(url)
}
}
func cancel() {
self.currentUploadTask?.cancel()
}
}
2.在这里我们如何使用
首先,为主要功能创建一个完成块,当您成功上传所有图像时,它将通知您。
/// This is your images array
let images = [image1, image2, image3, image4]
/// Here is the completion block
typealias FileCompletionBlock = () -> Void
var block: FileCompletionBlock?
以下是两个函数,第一个是第一个函数,它将开始上载,第二个是递归,如果有下一个图像可以上载,它将调用自己。
func startUploading(completion: @escaping FileCompletionBlock) {
if images.count == 0 {
completion()
return;
}
block = completion
uploadImage(forIndex: 0)
}
func uploadImage(forIndex index:Int) {
if index < images.count {
/// Perform uploading
let data = UIImagePNGRepresentation(images[index])!
let fileName = String(format: "%@.png", "yourUniqueFileName")
FirFile.shared.upload(data: data, withName: fileName, block: { (url) in
/// After successfully uploading call this method again by increment the **index = index + 1**
print(url ?? "Couldn't not upload. You can either check the error or just skip this.")
self.uploadImage(forIndex: index + 1)
})
return;
}
if block != nil {
block!()
}
}
最后是带有完成块的主要功能
startUploading {
/// All the images have been uploaded successfully.
}
编辑新Firebase的“上传”功能:
唯一的区别是下载URL的方式。这是相同的新Firebase文档。
func upload(data: Data,
withName fileName: String,
atPath path:StorageReference,
block: @escaping (_ url: String?) -> Void) {
// Upload the file to the path
self.currentUploadTask = path.putData(data, metadata: nil) { (metaData, error) in
guard let metadata = metadata else {
// Uh-oh, an error occurred!
block(nil)
return
}
// Metadata contains file metadata such as size, content-type.
// let size = metadata.size
// You can also access to download URL after upload.
path.downloadURL { (url, error) in
guard let downloadURL = url else {
// Uh-oh, an error occurred!
block(nil)
return
}
block(url)
}
}
}
问题内容: 我试图在数据库表的一行中上传多个图像并在显示页面中访问它们。我已经尝试过本教程: laraveldaily.com/upload-multiple- files-laravel-5-4/, 但是有两个不同的表建立关系。 我希望这在单个表中发生。 问题答案: 这是最适合我的: 首先以您的形式执行此操作: 这是多项选择: 现在在您的控制器中执行以下操作: 希望这行得通
我正在开发应用程序,用户必须上传多个图像。现在我面临的问题是他们的规模。由于用户可以上传多个图像,这需要大量的时间来通过应用程序上传它们,因为它们太大了,用户不喜欢,也使我的应用程序和数据库沉重。你能指导我如何在上传多张图片到firebase之前压缩它们吗? 用于压缩图像的代码 模特班 } 引发异常
问题内容: 我在Swift iOS项目中使用Google Firebase。我的应用程序有一部分,用户从设备中选择多张照片进行上传。我正在尝试找到最佳实践,以将他们一次选择的所有照片上传到Firebase Storage。我知道如何上传一张照片。 我浏览了文档,没有看到有关上载多个NSData对象的任何方法,所以我只需要运行for循环并分别上载每个图像? 谢谢!感谢所有反馈。 问题答案: @Fra
我正在用Swift开发一个iPhone应用程序。我正在使用Alamofire框架来处理http请求。我将用于POST,GET等,如下所示: 我使用将图像上载到服务器: 谁能帮我解决这个问题? 谢谢!:)
我试图上传图像与多个参数使用阿拉莫菲尔多部分与swift 4,但我不能上传图像成功,我得到的回应如下 这是我在上传按钮事件中调用的函数。 当我转换图像使用UIImagePNG表示与相同的方法只是改变一行 MultipartFormData.append(ImageData!,带名称:图像,文件名:image.png,mimeType:图像/png) 它会给我这样的感觉 请帮帮我!!
我正在尝试使用DropZone上载多个文件。但在控制器中检索文件名时出现问题。请帮我找出哪里出了错。我已经在下面发布了我的代码。 DropZone的HTML代码: 脚本文件,用于: 在控制器actionCreate()方法中: 当我在拖放框中添加图片并点击提交按钮时,拖放框中的图片显示成功结果。但是当我试着打印$模型的时候-