Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload image with parameters using Alamofire in Swift

Tags:

I am developing an iPhone application with swift. and I'am using Alamofire framework for handling http requests. I use Alamofire.request for POST , GET and etc like this:

Alamofire.request(.POST, myURL , parameters: ["a": "1", "b" : "2" ])         .response { (request, response, data, error) in }   

And I use Alamofire.upload to upload image to server this :

Alamofire.upload(.POST, uploadURL , fileURL) 

And both works perfectly, but now I want to upload an image and also send some parameters with, and my content type should be multipart/form-data and Alamofire.upload does not accept parameters.

There are two more question on SO about this issue with swift, which first one is not using Alamofire (and really, why not?) and in second one, mattt (Alamofire Developer) cited to use encoding parameters.

I checked his example, but still couldn't figure out how to do that.

Can any one please help me solve this problem?

Thank you! :)

like image 999
Reza_Rg Avatar asked Oct 21 '14 22:10

Reza_Rg


People also ask

How do I upload files using Alamofire?

Here is a simple function that requires the target upload url, parameters, and imageData and returns the URLRequestConvertible and NSData that Alamofire. upload requires to upload an image with parameters. almost right, uploadData. appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.


2 Answers

you can use Alamofire 3.0+ below code

func uploadImageAndData(){     //parameters     let gender    = "M"     let firstName = "firstName"     let lastName  = "lastName"     let dob       = "11-Jan-2000"     let aboutme   = "aboutme"     let token     = "token"      var parameters = [String:AnyObject]()     parameters = ["gender":gender,                   "firstName":firstName,                   "dob":dob,                   "aboutme":about,                   "token":token,                   "lastName":lastName]      let URL = "http://yourserviceurl/"     let image = UIImage(named: "image.png")      Alamofire.upload(.POST, URL, multipartFormData: {         multipartFormData in          if let imageData = UIImageJPEGRepresentation(image, 0.6) {             multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png")         }          for (key, value) in parameters {             multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)         }     }, encodingCompletion: {         encodingResult in          switch encodingResult {         case .Success(let upload, _, _):             print("s")             upload.responseJSON {                  response in                 print(response.request)  // original URL request                 print(response.response) // URL response                 print(response.data)     // server data                 print(response.result)   // result of response serialization                  if let JSON = response.result.value {                     print("JSON: \(JSON)")                 }             }         case .Failure(let encodingError):             print(encodingError)         }     }) } 
like image 92
amit gupta Avatar answered Oct 27 '22 16:10

amit gupta


SWIFT 2 AlamoFire Simple Image Upload (REST API)

@amit gupta It seems answer contains big overhead. AlamoFire contain load of simplified solution. Alamofire.request method contains several simplified overload which can use to upload in simple manner. By using Alamofire.request( method developer can get rid of encoding overhead.

HTTP Status 415 gives because of not specifying the correct media type.

Please check my solution below.

import UIKit import Alamofire  class ViewController: UIViewController {      @IBOutlet var imageView: UIImageView!     @IBOutlet var btnUpload: UIButton!     override func viewDidLoad() {         super.viewDidLoad()     }      func successDataHandler(responseData:String){          print ("IMAGE UPLOAD SUCCESSFUL    !!!")      }      func failureDataHandler(errorData:String){          print ("  !!!   IMAGE UPLOAD FAILURE   !!! ")      }      @IBAction func actionUpload(sender: AnyObject) {          let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages"          let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!]          uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler)     }      func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) -> (),failureHandler: (String) -> ()) -> () {          let headerData:[String : String] = ["Content-Type":"application/json"]          Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in             switch response.result {             case .Success:                 print(response.response?.statusCode)                 successHandler(response.result.value!)             case .Failure(let error):                 failureHandler("\(error)")             }         }     }      override func didReceiveMemoryWarning() {         super.didReceiveMemoryWarning()         // Dispose of any resources that can be recreated.     }   } 
like image 40
Chamath Jeevan Avatar answered Oct 27 '22 18:10

Chamath Jeevan