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

Multipart-form data POST to upload image not working after boundary is added in Swift

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

user_id 3232424234
photo *PHOTO DATA*

我按照此 post 底部所示设置了我的请求,但收到以下错误:

Optional(Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSUnderlyingError=0x7f86235cfe40 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={_kCFStreamErrorCodeKey=-4, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=ENDPOINTURL, NSErrorFailingURLKey=ENDPOINTURL, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-4, NSLocalizedDescription=The network connection was lost.})

这个错误对我来说似乎非常奇怪,因为我可以通过省略 POST 请求的边界要求来让它消失,但是服务器然后以 500 爆炸并让客户端知道它省略了边界要求,所以是的。我可能在 Swift 中做错了什么。下面是我提出请求的代码。让我知道是否需要更多信息,thx guru's of the world。

//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. 边界应该是NSUUID().UUIDString

  2. 当你在Content-Typeheader中添加边界时,你不应该在那里添加--

  3. 多部分请求的各个部分不是well-formed。例如,您缺少 Content-Disposition.

  4. 不重要,但不需要设置请求的Content-Length。已经为您完成了。

我建议您参考这个答案,它提供了如何形成多部分请求的示例:Upload image with parameters in Swift. Or consider using Alamofire,它会为您处理所有这些。