【发布时间】:2015-10-01 14:28:58
【问题描述】:
我正在尝试使用 multipart 创建一个包含图像和其他一些值的新对象,但我无法让它工作。
这是我在不上传图片的情况下使用的代码(可行):
let request = NSMutableURLRequest(URL: NSURL(string: self.submitLink)!)
let session = NSURLSession.sharedSession()
let params = [
"article": [
"name" : name,
"description" : fullDescription.text!,
"subdescription" : sDescription,
"category_id" : categoriesArray[self.categoryPicked]["id"] as! Int,
"location_id" : locationsArray[self.locationPicked]["id"] as! Int,
"Xcoordinate" : self.lat,
"Ycoordinate" : self.lng,
"user_id" : User.sharedInstance.userId,
"article_images_attributes[][image]" : ""
]
]
request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions())
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.HTTPMethod = "POST"
let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in
print("article created.")
})
task.resume()
这是我目前正在使用的代码(不工作):
let params = [
"article[name]" : name,
"article[description]" : fullDescription.text!,
"article[subdescription]" : sDescription,
"article[category_id]" : categoriesArray[self.categoryPicked]["id"] as! Int,
"article[location_id]" : locationsArray[self.locationPicked]["id"] as! Int,
"article[Xcoordinate]" : self.lat,
"article[Ycoordinate]" : self.lng,
"article[user_id]" : User.sharedInstance.userId
]
let boundaryConstant = "----------V2ymHFg03ehbqgZCaKO6jy"
let fileParamConstant = "article[article_images_attributes][][image]"
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest(URL: NSURL(string: self.submitLink)!)
request.HTTPMethod = "POST"
let contentType = "multipart/form-data; boundary=\(boundaryConstant)"
request.setValue(contentType, forHTTPHeaderField: "Content-Type")
let body = NSMutableData()
for param in params {
print(param)
body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition: form-data; \(param.key)=\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("\(param.value)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
}
let imageData = UIImageJPEGRepresentation(self.photoArray[0], 1)
if imageData != nil {
body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition: form-data; name=\(fileParamConstant); filename=\"image.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Type: application/octet-stream\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(imageData!)
body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
}
body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
request.HTTPBody = body
let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in
print(request)
print(data)
})
task.resume()
每当我尝试提交表单时,服务器都会回复:
NoMethodError(nil:NilClass 的未定义方法“名称”)
所以我认为我定义参数的方式有问题?有人可以更深入地向我解释一下,以便我知道我做错了什么吗?
【问题讨论】:
-
服务器回复该消息?您是否使用过诸如 Charles 或 Wireshark 之类的 http 代理来调查发送的内容?
标签: ios image swift multipartform-data nsurlsession