通过Swift 3和Alamofire 4 |上传带有JSON和自定义标题的照片/文件 iOS | 迅速

我需要使用Image文件和JSON调用Multipart请求。

我已经尝试过,但仍然得到错误。

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

如何发送JSON?

尝试此代码多个上传图像在单个请求,此代码已经工作。

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

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

从你提供的数据中,我得出如下的结论。

状态码400意味着你传递给api的json没有遵循api文档。 例如,如果他们期望一个关键的“名字”,你根本就没有得到这样的关键。

其他可能的原因,这个错误。

好像你没有提到任何内容types

添加这些代码行以确保响应和您的请求格式正确

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

Accept头告诉服务器你的客户在响应中想要什么。 Content-Type头告诉服务器客户端在请求中发送了什么。

如果你能提供更多的信息,我们可以进一步帮助。

在这里,我做了我的自定义web服务,你可以使用它。 这个webservice是用于上传字典与图像和video或两者或没有它。

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

用法:

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