在Swift中添加边界后,用于上传图像的多部分表单数据POST

时间:2016-01-13 16:20:38

标签: ios swift post multipartform-data

所以我尝试使用以下格式在Swift中执行多部分的发布请求:

user_id 3232424234
photo *PHOTO DATA*

我设置了我的请求,如本文底部所示,我收到以下错误:

  

可选(错误域= NSURLErrorDomain代码= -1005“网络连接已丢失。”UserInfo = {NSUnderlyingError = 0x7f86235cfe40 {错误域= kCFErrorDomainCFNetwork代码= -1005“(null)”UserInfo = {_ kCFStreamErrorCodeKey = -4,_kCFStreamErrorDomainKey = 4}},NSErrorFailingURLStringKey = ENDPOINTURL ,NSErrorFailingURLKey = ENDPOINTURL ,_ kCFStreamErrorDomainKey = 4,_kCFStreamErrorCodeKey = -4,NSLocalizedDescription =网络连接丢失。})

这个错误对我来说似乎非常奇怪,因为我可以通过省略POST请求的边界要求来消除它,但是服务器比使用500爆炸而让客户端知道它省略了边界请求,所以是的。我可能在Swift中做错了什么。以下是我提出请求的代码。如果需要更多信息,请告诉我,这是世界上的大师。

//Inputs in this scope are an "id" and a "photo"
let url = NSURL(string: "**URL**")
let boundary = NSUUID()
let request = NSMutableURLRequest(URL: url!)

request.HTTPMethod = "POST"
request.setValue("multipart/form-data; boundary=--\(boundary)", forHTTPHeaderField: "Content-Type")

let parameterBody:NSDictionary = [
    "user_id": id,
]

let data:NSMutableData = NSMutableData()

parameterBody.enumerateKeysAndObjectsUsingBlock { (parameterKey: AnyObject, parameterValue: AnyObject, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
    data.appendData(NSString(string: "--\(boundary)\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
    data.appendData(NSString(string: "\(parameterKey) \(parameterValue)\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
}

data.appendData(NSString(string: "--\(boundary)\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
data.appendData(NSString(string: "photo").dataUsingEncoding(NSUTF8StringEncoding)!)
data.appendData(photo.imageData as! NSData)
data.appendData(NSString(string: "--\(boundary)--\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

request.setValue("\(data.length)", forHTTPHeaderField: "Content-Length")

let task = NSURLSession.sharedSession().uploadTaskWithRequest(request, fromData: data) { (responseJSON: AnyObject?, response: NSURLResponse?, error: NSError?) -> Void in
    //Here I handle the response and check for errors.
}

task.resume()

1 个答案:

答案 0 :(得分:1)

这里有很多问题:

  1. 边界应为DataName

  2. 当您将边界添加到NSUUID().UUIDString标题时,不应在其中添加Content-Type

  3. 多部分请求的各个部分格式不正确。例如,您错过了--

  4. 这并不重要,但您无需设置Content-Disposition请求。这是为你完成的。

  5. 我建议你参考这个答案,它提供了如何形成多部分请求的示例:Upload image with parameters in Swift。或者考虑使用Alamofire,它会为您完成所有这些工作。