繁体   English   中英

错误406从Swift iOS将图像上传到服务器

[英]Error 406 uploading image to server from swift ios

我试图从我的iOS应用程序中上传一张用swift编写的图像,并尝试了一些有关它的代码,但没有任何效果。

通过Throung Postman上传非常完美。 这里是Postman中请求的屏幕截图:

用邮递员上传图像

如您所见,API期望一个带有JSON的PUT请求,其中只有一个字段称为“头像”,然后是其中的图像。 还请记住表单数据。 在标头中,我仅发送令牌进行身份验证。

这样说,在Swift代码中,我尝试仅使用带有图像编码的“ avatar”键将数组作为参数发送:

func uploadImage(url: String){

    let httpMethod: String = "PUT"

    var token = getTokenFromNSUserDefaults()

    var imageDataJpeg = UIImageJPEGRepresentation(self.myImage, 0.9)
    var base64StringJpeg = imageDataJpeg.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) // encode the image
    var base64StringJpeg2 = imageDataJpeg.base64EncodedStringWithOptions(nil) // encode the image

    var imageDataPng = UIImagePNGRepresentation(self.myImage)
    var base64StringPng = imageDataPng.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) // encode the image
    var base64StringPng2 = imageDataPng.base64EncodedStringWithOptions(nil) // encode the image

    // API Request
    self.request(httpMethod, token: token, params:["avatar":base64StringPng2], url: url) { (succeeded: Bool, msg: String) -> () in
        var alert = UIAlertView(title: "Success!", message: msg, delegate: nil, cancelButtonTitle: "Okay.")
        if(succeeded) {
            println("Success")
        }
        else {
            println("Fail")
        }

        // Move to the UI thread
        dispatch_async(dispatch_get_main_queue(), { () -> Void in

        })
    }
}


//// API REQUEST ////
func request(httpMethod: String, token: String, params: Dictionary<String, AnyObject>, url : String, postCompleted : (succeeded: Bool, msg: String) -> ()) {

    var request = NSMutableURLRequest(URL: NSURL(string: url)!)
    var session = NSURLSession.sharedSession()

    request.HTTPMethod = httpMethod

    var err: NSError?

    if token != ""{
        request.addValue("JWT \(token)", forHTTPHeaderField: "Authorization")
    }

    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)

    ////Option 1
    request.addValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
    request.addValue("multipart/form-data", forHTTPHeaderField: "Content-Disposition")
    request.addValue("multipart/form-data", forHTTPHeaderField: "Accept")

    ////Option 2
    //request.addValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
    //request.addValue("multipart/form-data", forHTTPHeaderField: "Content-Disposition")
    //request.addValue("application/json", forHTTPHeaderField: "Accept")

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        println("Response: \(response)")
        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("Body: \(strData)")
        var err: NSError?

        var msg = "No message"

        let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &err)
        println("JSON: \(json)")

        if(err != nil) {
            println(err!.localizedDescription)
            let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("Error could not parse JSON1: '\(jsonStr)'")
            postCompleted(succeeded: false, msg: "Error")
        }
        else {

            self.parseJson(json!)

            postCompleted(succeeded: true, msg: "Works!")
            return
        }
    })

    task.resume()
}

这是来自服务器的日志响应,始终带有406错误消息,如下所示(不要查看“审查”的URL):

Response: <NSHTTPURLResponse: 0x7f967bed1450> { URL: https://***********************/ } { status code: 406, headers {
    Allow = "GET, PUT, DELETE, HEAD, OPTIONS";
    Connection = "keep-alive";
    "Content-Type" = "application/json";
    Date = "Wed, 02 Dec 2015 18:30:13 GMT";
    Server = "nginx/1.4.6 (Ubuntu)";
    "Transfer-Encoding" = Identity;
    Vary = Accept;
    "X-Frame-Options" = SAMEORIGIN;
} }
Body: Optional()
JSON: nil
The operation couldn’t be completed. (Cocoa error 3840.)
Error could not parse JSON1: 'Optional()'
Fail

非常感谢您的提前帮助!

您的“参数”不是JSON格式-缺少JSON字典的花括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM