Upload photo / file using JSON and custom headers via Swift 3 and Alamofire 4 | iOS | swift

I need to call a Multipart request with an image file and JSON.

I tried this, but still getting an 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 JSON?

+7
ios swift multipart alamofire alamofireimage
source share
3 answers

Try this code to download multiple images in one 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]) } } 

Download 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 } }) } 
+3
source share

From the data you provided, I come to the conclusion below.

A status code of 400 means that the json you are passing the api did not complete the api documentation. For example, if they expect a key "name" and you are not provided with such a key at all.

Other possible causes of this error.

It looks like you have not mentioned any of the types of content

Add these lines of code to make sure the response and your request are in the correct formats.

 Alamofire.request(.GET, "your url", parameters: ["foo": "bar"]) .validate(statusCode: 200..<300) .validate(contentType: ["application/json"]) .response { (_, _, _, error) in println(error) } 

The Accept header tells the server what your client wants in response. The Content-Type header tells the server that the client is sending a request.

If you can provide more information, we can help in the future.

+2
source share

Here I made my own web service, you can use it. This web service is designed to download a dictionary with an image and video, with or without both.

 import Foundation import Alamofire class WebServiceHandler: AnyObject { func uploadWithAlamofire(Parameters params : [NSObject : AnyObject]?,ImageParameters imgparams : [NSObject : AnyObject]?,VideoParameters vidoparam : [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void) { var base_url = "http://benzatineinfotech.com/webservice/finder/index.php/Web_api/" base_url.append(action as String) Alamofire.upload(multipartFormData: { multipartFormData in if imgparams != nil{ for (key, value) in imgparams! { if let imageData = UIImageJPEGRepresentation(value as! UIImage, 1) { multipartFormData.append(imageData, withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000)).jpg", mimeType: "image/jpg") } } } if vidoparam != nil{ for (key, value) in vidoparam! { multipartFormData.append(value as! URL , withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000).mp4", mimeType: "application/octet-stream") } } if params != nil { for (key, value) in params! { multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String) } } }, to: base_url, method: .post, headers: nil, encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.uploadProgress { progress in print(progress.fractionCompleted) } upload.response { [weak self] response in guard self != nil else { return } let responseString = String(data: response.data!, encoding: String.Encoding.utf8) return success(responseString as AnyObject) } case .failure(let encodingError): print("error:\(encodingError)") return failure(encodingError as AnyObject) } }) } func convertToDictionary(text: String) -> [String: Any]? { if let data = text.data(using: .utf8) { do { return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] } catch { print(error.localizedDescription) } } return nil } } 

Using:

 self.webservice.uploadWithAlamofire(Parameters: dict_params as [NSObject : AnyObject], ImageParameters: imgparam as [NSObject : AnyObject], VideoParameters: videoparam as [NSObject : AnyObject], Action: "write_message", success: { (success) in print(success) }) { (error) in print(error) } 
+1
source share

All Articles