Search code examples
iosswiftalamofiremultipartalamofireimage

Upload Photo / File with JSON and custom headers via Swift 3 and Alamofire 4 | iOS | Swift


I need to call the Multipart request with Image file and JSON.

I have tried this, but still getting the error.

 // define parameters
  let parameters = [
    "hometown": "yalikavak",
    "living": "istanbul"
  ]

Alamofire.upload(multipartFormData: { multipartFormData in
    if let imageData = UIImageJPEGRepresentation(image, 1) {
      multipartFormData.append(imageData, withName: "file", fileName: "file.png", mimeType: "image/png")
    }

    for (key, value) in parameters {
      multipartFormData.append((value?.data(using: .utf8))!, withName: key)
    }}, to: "upload_url", method: .post, headers: ["Authorization": "auth_token"],
        encodingCompletion: { encodingResult in
          switch encodingResult {
          case .success(let upload, _, _):
            upload.response { [weak self] response in
              guard let strongSelf = self else {
                return
              }
              debugPrint(response)
            }
          case .failure(let encodingError):
            print("error:\(encodingError)")
          }
  })
}

How to send the JSON?


Solution

  • Try This Code for Multiple upload Images in Single Request, This code is already working.

         // For Pass Valid Parameters & number of Images in Array in Image Upload Function
         var dicImgData : NSMutableDictionary? = NSMutableDictionary()
    
         if let img = UIImage(named: "Your Image") {
             if let data:Data = UIImagePNGRepresentation(img) {
                 var imageData : NSData = data
                 dicImgData! .setObject(imageData, forKey: "data" as NSCopying)
                 dicImgData! .setObject("file", forKey: "name" as NSCopying)
                 dicImgData! .setObject("file.png", forKey: "fileName" as NSCopying)
                 dicImgData! .setObject("image/png", forKey: "type" as NSCopying)
    
                 let dicParameter = [
                     "hometown": "yalikavak",
                     "living": "istanbul"
                 ]
    
                 self.uploadImage(url: "Your URL", Parameter: dicParameter, Images: [dicImgData])
             }
        }
    

    Upload Function

        func uploadImage (url: String, Parameter param : NSDictionary, Images arrImage: NSArray) -> Void
        {
            var requestURL : String! = url
            let headers = [
                "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
                "Accept": "application/json",
                ]
    
            print("---------------------")
            print("Request URL :- \(requestURL)")
            print("---------------------")
    
            Alamofire.upload(multipartFormData: { (data) in
    
                for (key, value) in param {
                    data.append((value as! String).data(using: .utf8)!, withName: key as! String)
                }
    
                for imageInfo in arrImage
                {
                    var dicInfo : NSDictionary! = imageInfo as! NSDictionary
                    data.append(dicInfo["data"] as! Data, withName: dicInfo["name"] as! String, fileName: dicInfo["fileName"] as! String, mimeType: dicInfo["type"] as! String)
                    dicInfo = nil
                }
    
            }, to: requestURL, method: .post , headers:nil, encodingCompletion: { (encodeResult) in
                switch encodeResult {
                case .success(let upload, _, _):
    
                    upload.responseJSON(completionHandler: { (response) in
    
                        switch response.result
                        {
                        case .success(let responseJSON):
                            guard let dicResponse = responseJSON as? NSDictionary else{
                                return
                            }
    
                            print("Response : \((dicResponse))")
    
                        case .failure(let error):
    
                            print(error)
    
                            break
                        }
                    })
                case .failure(let error):
                    print(error)
                    break
                }
            })
        }