使用swift 3中的JSON参数上传图像

时间:2017-09-15 14:06:41

标签: ios swift

我只是想在NSURLSession swift 3中使用json参数上传图像

URL: “HTTP:XXXXXXXX” JSON参数:{“data”:{“userId”: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!)
    }
}

在后端目标中获取错误,因为[“userId”:9]无法反序列化

1 个答案:

答案 0 :(得分:0)

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

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

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