How to upload multiple images in multipart using Alamofire?

六眼飞鱼酱① 提交于 2019-11-28 13:55:17

I Hope it will be helpful for you:

Using Swift 3x: (I have uploaded four Photos in this snippet)

 //MARK: - upload multiple photos

    func uploadImagesAndData(params:[String : AnyObject]?,image1: UIImage,image2: UIImage,image3: UIImage,image4: UIImage,headers : [String : String]?, completionHandler:@escaping CompletionHandler) -> Void {

        let imageData1 = UIImageJPEGRepresentation(image1, 0.5)!
        let imageData2 = UIImageJPEGRepresentation(image2, 0.5)!

        let imageData3 = UIImageJPEGRepresentation(image3, 0.5)!

        let imageData4 = UIImageJPEGRepresentation(image4, 0.5)!


        Alamofire.upload(multipartFormData: { multipartFormData in

                for (key, value) in params! {
                    if let data = value.data(using: String.Encoding.utf8.rawValue) {
                        multipartFormData.append(data, withName: key)
                    }
                }

                multipartFormData.append(imageData1, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                multipartFormData.append(imageData2, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                multipartFormData.append(imageData3, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                multipartFormData.append(imageData4, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")

        },
            to: K_BASEURL + K_API_LOGINDATA, encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload
                        .validate()
                        .responseJSON { response in
                            switch response.result {
                            case .success(let value):
                                print("responseObject: \(value)")
                            case .failure(let responseError):
                                print("responseError: \(responseError)")
                            }
                    }
                case .failure(let encodingError):
                    print("encodingError: \(encodingError)")
                }
        })
    }

In Swift 3 and above Just append "[]" with image key identifier to treat it as array of images.

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)
                }

        })

To upload multiple image you need to call this code in loop

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

1) To upload multiple image using Alamofire in Swift3

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)
            }
        })
    }

2) To call Function

        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")
            }
        }

3) Extension to create file name

//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
    }
}
Yogendra Singh
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")
        }

    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!