将图像上传到Flickr

时间:2016-12-07 09:13:23

标签: ios swift rest api flickr

我正在尝试从我的应用上传图片到Flickr。我已经提到了一些Objective-C代码,但没有成功。

我目前使用的代码是:

func calUploadImageAPI(image:UIImage){

    DispatchQueue.main.async(execute: {


    })
    var resultFromServer: Any?
    var body : Data = Data()
    var boundry = String()
    boundry = NSUUID().uuidString
    // Request
    //
    var request = URLRequest(url:URL(string:"https://up.flickr.com/services/upload/")!)
    request.setValue("multipart/form-data; boundary=\(boundry)", forHTTPHeaderField: "Content-Type")
    request.timeoutInterval = 150.0
    request.httpMethod="POST"

    var fileData = NSData()

    fileData = UIImagePNGRepresentation(image)! as NSData
    //proceed with resume upload

    let md5Data = MD5(string:"\(userAuthSecret)api_key\(userKey)auth_token\(userAuthToken)")
    let md5Hex =  md5Data!.map { String(format: "%02hhx", $0) }.joined()

    body.append(String("--\(boundry)\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("Content-Disposition: form-data; name=\"api_key\"\r\n\r\n\(userKey)\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("--\(boundry)\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("Content-Disposition: form-data; name=\"auth_token\"\r\n\r\n\(userAuthToken)\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("--\(boundry)\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("Content-Disposition: form-data; name=\"api_sig\"\r\n\r\n\(md5Hex)\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("--\(boundry)\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("Content-Disposition: form-data; name=\"\("photo")\"; filename=\"\("profile_image.png")\"\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("Content-Type: image/jpeg\r\n\r\n").data(using: String.Encoding.utf8)!)
    body.append(fileData as Data)
    body.append(String("\r\n").data(using: String.Encoding.utf8)!)
    body.append(String("--\(boundry)--\r\n").data(using: String.Encoding.utf8)!)

    request.httpBody = body
    //session
    let configuration = URLSessionConfiguration.default
    configuration.requestCachePolicy = .reloadIgnoringCacheData
    let session : URLSession
    session = URLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
    session.dataTask(with: request) { (data, resp, error) -> Void in


        if error != nil {

            DispatchQueue.main.async(execute: {


            })


        }else {

            if data != nil {

                let httpResponse: HTTPURLResponse = resp as! HTTPURLResponse

                if httpResponse.statusCode == 200  || httpResponse.statusCode == 201 || httpResponse.statusCode == 202 || httpResponse.statusCode == 204 {


                    do {

                        resultFromServer = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
                        if let respArr = resultFromServer as? NSArray{

                            print("Resp Array:\(respArr)")

                        }


                        if let respDict = resultFromServer as? NSDictionary{

                            print("Resp Dict:\(respDict)")


                        }

                        //post noif

                        DispatchQueue.main.async(execute: {


                            //post notif
                            //no image? get newone
                            //                                NSNotificationCenter.defaultCenter().postNotificationName(downloadimageURLNotif, object: nil)
                        })




                    } catch let error as NSError {


                        print("ERROR: \(error.description)")
                        DispatchQueue.main.async(execute: {



                        })

                    }



                } else if httpResponse.statusCode == 401  || httpResponse.statusCode == 403 || httpResponse.statusCode == 498 || httpResponse.statusCode == 400 {

                    //get msg
                    do {

                        resultFromServer = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
                        if let respArr = resultFromServer as? NSArray{

                            print("Resp Array:\(respArr)")

                        }


                        if let respDict = resultFromServer as? NSDictionary{

                            print("Resp Dict:\(respDict)")


                        }
                        DispatchQueue.main.async(execute: {

                        })


                    } catch let error as NSError {


                        print("ERROR: \(error.description)")
                        DispatchQueue.main.async(execute: {

                        })

                    }



                }


            }


        }

        }.resume()




}

md5方法是

 func MD5(string: String) -> Data? {
        guard let messageData = string.data(using:String.Encoding.utf8) else { return nil }
        var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))

        _ = digestData.withUnsafeMutableBytes {digestBytes in
            messageData.withUnsafeBytes {messageBytes in
                CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
            }
        }

        return digestData
    }

但是我收到以下错误:

"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<rsp stat=\"fail\">\n\t<err code=\"98\" msg=\"Invalid auth token\" />\n</rsp>\n"

但我已交叉检查,我的代币是正确的。我使用 OAuthSwift 项目获取它们。

0 个答案:

没有答案