2017-09-15 83 views
0

我只是想用JSON参数图片上传NSURLSession迅速3上传与SWIFT 3

网址JSON参数图片: “HTTP:XXXXXXXX” 的JSON参数:{ “数据”:{”用户id “:9}}

请帮我完成它

下面是代码:

func UploadRequest() 
{ 
    let username = "v" 
    let password = "v" 
    let loginData = String(format: "%@:%@", username, password).data(using: String.Encoding.utf8)! 
    let base64LoginData = loginData.base64EncodedString() 

    let url = NSURL(string: "http://xxxxxxxxxxxx") 
    let request = NSMutableURLRequest(url: url! as URL) 
    request.httpMethod = "POST" 
    request.setValue("Basic \(base64LoginData)", forHTTPHeaderField: "Authorization") 
    request.setValue("Application/json", forHTTPHeaderField: "Content-Type") 


    if (imageView.image == nil) 
    { 
     return 
    } 

    let image_data = UIImageJPEGRepresentation(imageView.image!, 1) 


    if(image_data == nil) 
    { 
     return 
    } 

    let boundary = generateBoundaryString() 

    request.httpBody = createBodyWithParameters(filePathKey: "file", imageDataKey: image_data! as NSData, boundary: boundary) as Data 
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 


    let session = URLSession.shared 

    let task = session.dataTask(with: request as URLRequest){ 

     data, response, error in 

     self.loading.stopAnimating() 

     if data == nil{ 
      print("data is nil") 
     } 
     else 
     { 
      print("data is\(data!)") 
     } 

     if error == nil{ 
      print("error is nil") 
     } 
     else 
     { 
      print("error is \(error!)") 
     } 

     if response == nil{ 
      print("response is nil") 
     } 
     else 
     { 
      print("response is \(response!)") 
     } 

     print("hitted") 

     guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else { 
      print("error") 
      return 
     } 

     let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
     print(dataString!) 

    } 
    self.loading.stopAnimating() 

    task.resume() 

} 

func jsonToNSData(json: AnyObject) -> NSData?{ 
    return try? JSONSerialization.data(withJSONObject: json, options: []) as NSData 
} 

func generateBoundaryString() -> String 
{ 
    return "Boundary-\(NSUUID().uuidString)" 
} 
//[String:[String: Int]]? 

func createBodyWithParameters(filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData { 
    let body = NSMutableData(); 

    let param:[String:Any] = ["data":["data":["userId":9]]] 


    do { 


     for i in param { 

      body.appendString(string:"--\(boundary)\r\n") 
     body.appendString(string:"Content-Disposition: form-data; name=\"\(i.key)\"\r\n\r\n") 
      body.appendString(string:"\(i.value)\r\n") 

     } 

     let jsonData = try JSONSerialization.data(withJSONObject: param, options: .prettyPrinted) 
     let decoded = try JSONSerialization.jsonObject(with: jsonData as Data, options: []) 

     let filename = "user-profile.jpg" 
     let mimetype = "image/jpg" 

     body.appendString(string:"--\(boundary)\r\n") 
     body.appendString(string: "Content-Disposition: form-data; name=\"\(decoded)\"\r\n\r\n") 
     body.appendString(string:"\(decoded)\r\n") 

     body.appendString(string: "--\(boundary)\r\n") 
     body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n") 
     body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n") 
     body.append(imageDataKey as Data) 
     body.appendString(string: "\r\n") 

    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!) 

    return body 
} 


extension NSMutableData { 

    func appendString(string: String) { 
     let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true) 
     append(data!) 
    } 
} 

在后端的目标越来越误差[” 用户id“:9]不能DES将其字符串化

回答

0

错误看起来像它可能与序列化,反序列化然后将字典转换为字符串然后再次返回到数据的方式相关。在创建请求负载时,您可以在使用解码的属性而不是jsonData中看到这一点。

而不是body.appendString(string:"\(decoded)\r\n")

为什么不尝试: body.append(jsonData) body.appendString(string:"\r\n")