ios - 从 swift ios 将图像上传到服务器时出现错误 406

标签 ios image swift upload

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

通过 Postman 上传效果完美。这是 Postman 中请求的屏幕截图:

Uploading image with Postman

正如您所看到的,API 需要一个带有 JSON 的 PUT 请求,其中只有一个名为“avatar”的字段,然后是其中的图像。还要记住表单数据。在 header 中,我仅发送 token 来进行身份验证。

就是说,在 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

非常感谢您提前提供的帮助!

最佳答案

您的“params”不是 JSON 格式 - JSON 字典的大括号丢失。

关于ios - 从 swift ios 将图像上传到服务器时出现错误 406,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34050984/

相关文章:

android - 应用程序如何只供用户读取并且只有管理员有权发布(使用 firestorm 数据服务器)

ios - NSURLSession 与后台获取

ios - 如何在 swift 3 中生成 OAuth1 HMAC SHA1 签名

ios - 用 Swift 制作计算器

ios - 单击表格 View 单元格上的按钮单击单元格而不是按钮

ios - 如何在 ios swift 中显示来自 url 的图像

html - 如何使图片适合带有导航的页面

image - 在处理过程中调整任何屏幕尺寸的硬值

C# WPF 显示来自 Mysql 的图像

swift - 无法使用 Alamofire 直接上传到 S3