Ios 如何使用Alamofire在多个部分中上载多个图像?

Ios 如何使用Alamofire在多个部分中上载多个图像?,ios,swift,alamofire,multipart,alamofireimage,Ios,Swift,Alamofire,Multipart,Alamofireimage,我被困在上传多个图像在多部分使用阿拉莫菲尔。有人能帮我吗? 提前谢谢 有关更多详细信息,我将使用以下代码创建身体部位的图像数据: func imageArrayToNSData(array: [UIImage],boundary:String) -> NSData { let body = NSMutableData() var i = 0; for image in array{ let filename = "image\(i).jpg"

我被困在上传多个图像在多部分使用阿拉莫菲尔。有人能帮我吗? 提前谢谢

有关更多详细信息,我将使用以下代码创建身体部位的图像数据:

func imageArrayToNSData(array: [UIImage],boundary:String) -> NSData {
    let body = NSMutableData()
    var i = 0;
    for image in array{
        let filename = "image\(i).jpg"
        let data = UIImageJPEGRepresentation(image,0.8);
        let mimetype = "image/jpeg"
        let key = "product_images"
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(data!)
        body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        i += 1
    }

    body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    return body
}
要上载我正在使用的内容:

        Alamofire.upload(.POST, EDIT_PRODUCT_URL, headers: ["Accept": "application/json","Content-Type":"application/json"], multipartFormData: { (formData) in

        if productImages.count>0{
            let boundary = generateBoundaryString()
            let imageData = CommonClass.imageArrayToNSData(productImages,boundary: boundary)
            formData.appendBodyPart(data: imageData, name: "product_images", mimeType: "image/jpeg")
        }

        for (key, value) in params {
            if value is [String]{
                let data = CommonClass.stringArrayToNSData(value as! [String])
                formData.appendBodyPart(data:data , name: key)
            }else if value is String{
                formData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
            }else if let v = value as? Bool{
                var bValue = v
                let d = NSData(bytes: &bValue, length: sizeof(Bool))
                formData.appendBodyPart(data: d, name: key)
            }
        }

    }) { (encodingResult) in
        switch encodingResult {
        case .Success(let upload, _, _):
            KVNProgress.showProgress(CGFloat(0), status:"0% Sent")
            upload.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
                // This closure is NOT called on the main queue for performance
                // reasons. To update your ui, dispatch to the main queue.
                dispatch_async(dispatch_get_main_queue()) {
                    let prg = Int((CGFloat(totalBytesWritten)*100)/CGFloat(totalBytesExpectedToWrite))
                    if prg == 100{
                        KVNProgress.showSuccessWithStatus("Created")
                    }
                    KVNProgress.updateStatus("\(prg)% Sent")
                    KVNProgress.updateProgress(CGFloat(Float(prg)/100.0), animated: true)
                }
            }
            upload.responseJSON { response in
                CommonClass.hideLoader()
                switch response.result {
                case .Success:
                    if let value = response.result.value {
                        let json = JSON(value)
                        print_debug("edit Product JSON is\n\(json)");  
                        completionBlock(json)
                    }else{
                        completionBlock(nil)
                    }
                case .Failure(let error):
                    print_debug(error.description)
                    showErrorWithMessage("Oops! Couldn't connect to server!")
                    completionBlock(nil)
                }
            }

        case .Failure(let encodingError):
            print(encodingError)
        }
    }

任何人都可以让我建议使用Alamofire以多部分方式上载多个文件吗?

要上载多个图像,您需要在循环中调用此代码

let boundary = generateBoundaryString()
let imageData = CommonClass.imageArrayToNSData(productImages,boundary: boundary)
formData.appendBodyPart(data: imageData, name: "product_images", mimeType: "image/jpeg")

我希望这将对您有所帮助:

使用Swift 3x:(我在这段代码中上传了四张照片)

1)使用Swift3中的Alamofire上传多张图像

typealias APICompletionHandler = (code:Int, error:NSError?, response:AnyObject?) -> Void

func uploadIMultipart(_ strApiName:String, param : NSDictionary?, data:Array<NSDictionary>, header:[String : String]?, completionHandler:@escaping APICompletionHandler)
    {
        let strURL : String = strApiName

        let apiURL = try! URLRequest(url: strURL, method: .post, headers: header)

        Alamofire.upload(multipartFormData: { (multipartFormData) in
            // code
            var i : Int = 0
            for dict:NSDictionary in data {
                let extention = dict["format"] as? String
                let strMimeType = dict["strMimeType"] as? String
                let nameofFile:String = (6.randomString as String)+"."+extention!
                if (dict["data"] as? Data != nil) {
                    multipartFormData.append(Foundation.Data(dict["data"] as! Data), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!)
                } else {
                    let strUrl = dict["data"] as! String
                    let fileURL : URL? = URL(string: strUrl)
                    multipartFormData.append(try! Foundation.Data(contentsOf: fileURL!), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!)

                }
                i += 1
            }

            for (key, value) in param! {
                multipartFormData.append((value as! NSString).data(using: String.Encoding.utf8.rawValue)!, withName: key as! String)
            }

        }, with: apiURL, encodingCompletion: { (result) in
            // code
            switch result {

            case .success(let upload,_ ,_ ):
                upload.responseJSON { response in

                    switch response.result {
                    case .success(let data):
                        //Sucess
                    case .failure(let error):
                        print(error.localizedDescription)

                    }
                }
            case .failure(let encodingError):
                print(encodingError)
                completionHandler(0, encodingError as NSError?, nil)
            }
        })
    }
typealias ApicCompletionHandler=(代码:Int,错误:NSError?,响应:AnyObject?)->Void
func uploadIMultipart(u-strApiName:String,param:NSDictionary?,数据:数组,头:[String:String]?,completionHandler:@escaping-APICompletionHandler)
{
让strURL:String=strApiName
让apiURL=try!URLRequest(url:strURL,方法:.post,头:头)
上传(multipartFormData:{(multipartFormData)在
//代码
变量i:Int=0
对于dict:数据中的NSDictionary{
让extention=dict[“format”]作为字符串
让strimetype=dict[“strimetype”]作为?字符串
让nameofFile:String=(6.randomString作为字符串)+“+”扩展名!
如果(dict[“数据”]作为?数据!=nil){
multipartFormData.append(Foundation.Data(dict[“Data”]as!Data),名称:dict[“key”]as!String,文件名:nameofile,mimeType:strimetype!)
}否则{
设strUrl=dict[“数据”]为!字符串
let fileURL:URL?=URL(字符串:strUrl)
AppMultFraseDist.AppEnter(Tr.No.Fask.DATA(Ctrutsof:FrILURL!),使用Nosi:DAT[(KEY])AS字符串,文件名:NAMEOFILE,MIMETYPE:StrimeType!)
}
i+=1
}
用于参数中的(键、值){
multipartFormData.append((值为!NSString).data(使用:String.Encoding.utf8.rawValue)!,名称:key为!String)
}
},带有:apiURL,编码完成:{(结果)在
//代码
切换结果{
成功案例(让我们上传,,u):
upload.responseJSON{中的响应
开关响应。结果{
案例.成功(让数据):
//成功
案例。失败(let错误):
打印(错误。本地化描述)
}
}
案例失败(let encodingError):
打印(编码错误)
completionHandler(0,编码错误为NSError?,无)
}
})
}
2)调用函数

        let imageData : NSData = UIImagePNGRepresentation(imgUserProfile.image!)! as NSData
        let imageData1 : NSData = UIImagePNGRepresentation(imgUserProfile.image!)! as NSData

        let dict1: Dictionary = ["data":imageData,"key":"user_image", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
        let dict2: Dictionary = ["data":imageData1,"key":"image1", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
        let array: Array = [dict1,dict2]; //pass this image array

        self.uploadIMultipart(strAPI, param: dictParam as NSDictionary, data: array as Array<NSDictionary>, header: nil) { (code, error, response) in
            AppSingletonObj.stopLoading(inView: self.view)

            //API manager sucess or failure
            if code == 1 {
                let status = response?["success"]

                //API sucess or failure
                if(status as! Int == 1) {
                    print(response!)
                }
                else {
                    let errorMessage = response?["message"]
                    AppSingletonObj.showAlert(msg: errorMessage as! String)
                }
            }
            else {
                AppSingletonObj.showAlert(msg: "Some error occured! please try after sometime")
            }
        }
let-imageData:NSData=UIImagePNGRepresentation(imgUserProfile.image!)!作为NSData
让imageData1:NSData=UIImagePNGRepresentation(imgUserProfile.image!)!作为NSData
让dict1:Dictionary=[“data”:imageData,“key”:“user\u image”,“format”:“jpg”,“strimetype”:“image/jpeg”]作为[String:Any]
让dict2:Dictionary=[“data”:imageData1,“key”:“image1”,“format”:“jpg”,“strimetype”:“image/jpeg”]作为[String:Any]
让数组:数组=[dict1,dict2]//传递此图像数组
self.uploadIMultipart(strAPI,param:dictParam作为NSDictionary,data:array作为数组,header:nil){(代码,错误,响应)在
AppSingletonObj.stopLoading(查看:self.view)
//API管理器成功还是失败
如果代码==1{
让状态=响应?[“成功”]
//API成功或失败
if(状态为!Int==1){
打印(响应!)
}
否则{
让errorMessage=响应?[“消息”]
AppSingletonObj.showarert(消息:errormessageas!String)
}
}
否则{
AppSingletonObj.showarter(消息:“发生了一些错误!请稍后再试”)
}
}
3)创建文件名的扩展名

//MARK: CREATE RANDOM STRING of LENGTH
extension Int{
    var randomString : String {

        let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        let randomString : NSMutableString = NSMutableString(capacity: self)

        for _ in 0 ..< self{
            let length = UInt32 (letters.length)
            let rand = arc4random_uniform(length)
            randomString.appendFormat("%C", letters.character(at: Int(rand)))
        }
        return randomString as String
    }
}
//标记:创建任意长度的字符串
扩展整数{
var randomString:String{
let字母:NSString=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789”
let randomString:NSMutableString=NSMutableString(容量:self)
对于uu0..Swift 3及以上版本中的

只需在“[]”后面附加图像密钥标识符,将其视为图像数组

Alamofire.upload(multipartFormData: { multipartFormData in
            // import image to request
            for imageData in imagesData {
                multipartFormData.append(imageData, withName: "\(imageParamName)[]", fileName: "\(Date().timeIntervalSince1970).jpeg", mimeType: "image/jpeg")
            }
            for (key, value) in parameters {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
        }, to: urlString,

            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseJSON { response in

                    }
                case .failure(let error):
                    print(error)
                }

        })
Swift 4.2.
此处代码仅适用于无任何参数的情况。
如果需要传递额外的参数,只需使用@Hardik Thakkar代码即可

typealias APICompletionHandler = (code:Int, error:NSError?, response:AnyObject?) -> Void

@IBOutlet weak var thirdImage: UIImageView!
var fristImage:UIImage = UIImage()
var secondimage:UIImage = UIImage()

extension ViewController {

  func upload() {

    let imgData1 = fristImage.jpegData(compressionQuality: 0.7)
    let imgData2 = secondimage.jpegData(compressionQuality: 0.7)
    let imgData3 = thirdImage.image!.jpegData(compressionQuality: 0.7)
    let headers = [
        "Authorization" : "Bearer " + "Your Token",
        "Content-type": "form-data",
    ]
    let dict1: Dictionary = ["data":imgData1 as Any,"key":"Here Your Body Key1", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
    let dict2: Dictionary = ["data":imgData2 as Any,"key":"Here Your Body Key2", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
    let dict3: Dictionary = ["data":imgData3 as Any,"key":"Here Your Body Key3", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
    let array: Array = [dict1, dict2, dict3]; //pass this image array

    self.uploadIMultipart("Here Your URL", data: array as Array<NSDictionary>, header: headers) { (code, error, response) in

          let httpResponse = response as? HTTPURLResponse
          print("the resopnse code is : \(String(describing: httpResponse?.statusCode.description))")
    }
  }

  func uploadIMultipart(_ strApiName:String, data:Array<NSDictionary>, header:[String : String]?, completionHandler:@escaping APICompletionHandler) {

    let strURL : String = strApiName
    let apiURL = try! URLRequest(url: strURL, method: .post, headers: header)
    Alamofire.upload(multipartFormData: { (multipartFormData) in
        // code
        var i : Int = 0
        for dict:NSDictionary in data {
            let extention = dict["format"] as? String
            let strMimeType = dict["strMimeType"] as? String
            let nameofFile:String = (6.randomString as String)+"."+extention!
            if (dict["data"] as? Data != nil) {
                multipartFormData.append(Foundation.Data(dict["data"] as! Data), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!)
            } else {
                let strUrl = dict["data"] as! String
                let fileURL : URL? = URL(string: strUrl)
                multipartFormData.append(try! Foundation.Data(contentsOf: fileURL!), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!)    
            }
            i += 1
        }
    }, with: apiURL, encodingCompletion: { (result) in
        // code
        switch result {

        case .success(let upload,_ ,_ ):

            upload.responseJSON { response in
                switch response.result {
                case .success(let response):
                    //Sucess
                    print("response :-", response)
                case .failure(let error):
                    //Failure
                    print(error.localizedDescription)
                }
            }
        case .failure(let encodingError):
            print(encodingError)
            completionHandler(0, encodingError as NSError?, nil)
        }
    })
    }
}

extension Int{

    var randomString : String {

        let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        let randomString : NSMutableString = NSMutableString(capacity: self)

        for _ in 0 ..< self{
            let length = UInt32 (letters.length)
            let rand = arc4random_uniform(length)
            randomString.appendFormat("%C", letters.character(at: Int(rand)))
        }
        return randomString as String
    }
}
typealias ApicCompletionHandler=(代码:Int,错误:NSError?,响应:AnyObject?)->Void
@第三个图像:UIImageView!
var fristImage:UIImage=UIImage()
var secondimage:UIImage=UIImage()
扩展视图控制器{
func upload(){
设imgData1=fristImage.jpegData(压缩质量:0.7)
设imgData2=secondimage.jpegData(压缩质量:0.7)
设imgData3=thirdImage.image!.jpegData(压缩质量:0.7)
让标题=[
“授权”:“持票人”+“您的代币”,
“内容类型”:“表单数据”,
]
让dict1:Dictionary=[“data”:imgData1 as Any,“key”:“Here Your Body Key1”,“format”:“jpg”,“strimetype”:“image/jpeg”]作为[String:Any]
让dict2:Dictionary=[“data”:imgData2 as Any,“key”:“Here Your Body Key2”,“format”:“jpg”,“strimetype”:“image/jpeg”]作为[String:Any]
让dict3:Dictionary=[“data”:imgData3,如有,“key”:“这是您的
class func uploadImageToServer(uploadTo: String, imageParameters:[[String: Any]], otherParameters:[String: Any],authorization: String, completionHandler:@escaping ((_ responseValue: Any?, _ error: Error?) -> Void)) {

        if isNetWorkAvailable() {

            var urlRequest = URLRequest(url: URL.init(string: uploadTo)!)
            urlRequest.httpMethod = "POST"
            urlRequest.addValue(authorization, forHTTPHeaderField: "Authorization")
            DispatchQueue.main.async(execute: {
                ActivityIndicatorView.showActivity()
            })
           print("Request Url: \(uploadTo)\nRequest Params: \(imageParameters)\nRequest Params: \(otherParameters)")
            Alamofire.upload(multipartFormData: { (multipartFormData) in

                for (key,value) in otherParameters {
                    multipartFormData.append((value as! String).data(using: .utf8)!, withName: key)
                }

                for value  in imageParameters {
                    let image = value["image"] as! UIImage
                    let imgData = UIImageJPEGRepresentation(image, 1)!
                    let imageName = value["imageName"] as! String
                    let fileName = value["fileName"] as! String

                    multipartFormData.append(imgData, withName: imageName, fileName: fileName ,mimeType: "image/jpeg")
                }
            }, usingThreshold: UInt64.init(), with: urlRequest, encodingCompletion: { (encodingResult) in
                switch encodingResult {

                case .success(let upload, _, _):
                    upload.uploadProgress(closure: { (progress) in
                        let uploadPercetange = Int(progress.fractionCompleted*100)
                        print("Upload Progress: \(uploadPercetange)%")
                    })
                    upload.responseJSON(completionHandler: { (response) in
                        print(response.result.value ?? "NaN")
                        let result = response.result.value
                        completionHandler(result, nil)
                        DispatchQueue.main.async(execute: {
                            ActivityIndicatorView.hideActivity()
                        })
                    })

                case .failure(let encodingError):
                    print(encodingError)
                    let error = encodingError
                    completionHandler(nil, error)
                    DispatchQueue.main.async(execute: {
                        ActivityIndicatorView.hideActivity()
                    })
                }
            })
        } else {
            AlertView.showAlert(title: "Error", message: "Network not available")
        }

    }
typealias APICompletionHandler = (code:Int, error:NSError?, response:AnyObject?) -> Void

@IBOutlet weak var thirdImage: UIImageView!
var fristImage:UIImage = UIImage()
var secondimage:UIImage = UIImage()

extension ViewController {

  func upload() {

    let imgData1 = fristImage.jpegData(compressionQuality: 0.7)
    let imgData2 = secondimage.jpegData(compressionQuality: 0.7)
    let imgData3 = thirdImage.image!.jpegData(compressionQuality: 0.7)
    let headers = [
        "Authorization" : "Bearer " + "Your Token",
        "Content-type": "form-data",
    ]
    let dict1: Dictionary = ["data":imgData1 as Any,"key":"Here Your Body Key1", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
    let dict2: Dictionary = ["data":imgData2 as Any,"key":"Here Your Body Key2", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
    let dict3: Dictionary = ["data":imgData3 as Any,"key":"Here Your Body Key3", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any]
    let array: Array = [dict1, dict2, dict3]; //pass this image array

    self.uploadIMultipart("Here Your URL", data: array as Array<NSDictionary>, header: headers) { (code, error, response) in

          let httpResponse = response as? HTTPURLResponse
          print("the resopnse code is : \(String(describing: httpResponse?.statusCode.description))")
    }
  }

  func uploadIMultipart(_ strApiName:String, data:Array<NSDictionary>, header:[String : String]?, completionHandler:@escaping APICompletionHandler) {

    let strURL : String = strApiName
    let apiURL = try! URLRequest(url: strURL, method: .post, headers: header)
    Alamofire.upload(multipartFormData: { (multipartFormData) in
        // code
        var i : Int = 0
        for dict:NSDictionary in data {
            let extention = dict["format"] as? String
            let strMimeType = dict["strMimeType"] as? String
            let nameofFile:String = (6.randomString as String)+"."+extention!
            if (dict["data"] as? Data != nil) {
                multipartFormData.append(Foundation.Data(dict["data"] as! Data), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!)
            } else {
                let strUrl = dict["data"] as! String
                let fileURL : URL? = URL(string: strUrl)
                multipartFormData.append(try! Foundation.Data(contentsOf: fileURL!), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!)    
            }
            i += 1
        }
    }, with: apiURL, encodingCompletion: { (result) in
        // code
        switch result {

        case .success(let upload,_ ,_ ):

            upload.responseJSON { response in
                switch response.result {
                case .success(let response):
                    //Sucess
                    print("response :-", response)
                case .failure(let error):
                    //Failure
                    print(error.localizedDescription)
                }
            }
        case .failure(let encodingError):
            print(encodingError)
            completionHandler(0, encodingError as NSError?, nil)
        }
    })
    }
}

extension Int{

    var randomString : String {

        let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        let randomString : NSMutableString = NSMutableString(capacity: self)

        for _ in 0 ..< self{
            let length = UInt32 (letters.length)
            let rand = arc4random_uniform(length)
            randomString.appendFormat("%C", letters.character(at: Int(rand)))
        }
        return randomString as String
    }
}