在 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()
这里有很多问题:
边界应该是NSUUID().UUIDString
。
当你在Content-Type
header中添加边界时,你不应该在那里添加--
。
多部分请求的各个部分不是well-formed。例如,您缺少 Content-Disposition
.
不重要,但不需要设置请求的Content-Length
。已经为您完成了。
我建议您参考这个答案,它提供了如何形成多部分请求的示例:Upload image with parameters in Swift. Or consider using Alamofire,它会为您处理所有这些。
所以我正在尝试使用以下格式在 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()
这里有很多问题:
边界应该是
NSUUID().UUIDString
。当你在
Content-Type
header中添加边界时,你不应该在那里添加--
。多部分请求的各个部分不是well-formed。例如,您缺少
Content-Disposition
.不重要,但不需要设置请求的
Content-Length
。已经为您完成了。
我建议您参考这个答案,它提供了如何形成多部分请求的示例:Upload image with parameters in Swift. Or consider using Alamofire,它会为您处理所有这些。