我正在尝试从我的应用上传图片到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 项目获取它们。