Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload multiple images in multipart using Alamofire?

I am stuck in uploading multiple images in multipart using Alamofire. Can any one help me? Thanks in advance!!

For more details, I am using this code to create body part of images data:

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
}

to upload I am using :

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

Can any one please let me suggest the way to upload multiple files in multipart using Alamofire?

like image 372
Nakul Sharma Avatar asked Oct 30 '22 18:10

Nakul Sharma


2 Answers

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

        })
like image 131
Gurjit Singh Avatar answered Nov 15 '22 05:11

Gurjit Singh


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)")
                }
        })
    }
like image 27
Anurag Sharma Avatar answered Nov 15 '22 06:11

Anurag Sharma