2017-08-12 37 views
7

我需要使用Image文件和JSON调用Multipart请求。通过Swift 3和Alamofire 4上传带有JSON和自定义标题的照片/文件| iOS | Swift

我已经试过这个,但仍然收到错误。

// 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?

+0

你得到任何错误在这个片段? –

+0

是的,我得到HTTP代码400与消息 - 错误的请求。 –

+0

我可以请求URL吗?所以我可以尝试用更好的方式检查它 –

回答

3

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

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

上传功能

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

谢谢,它的工作原理;) –

2

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

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

此错误的其他可能的原因。

好像你还没有提到任何内容类型

添加这行代码,以确保响应和您的要求是正确的格式

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

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

如果您可以提供更多信息,我们可以提供更多帮助。

1

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

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) 
} 
相关问题