用多个参数在swift中上传图像

我正尝试使用swift将图像上传到后端客户端。 麻烦是我似乎无法得到格式正确的httpbody。 我不想使用多部分的forms上传,因为我不知道如何处理在后端。

这是我有的代码..它不工作,当我在网上查看图像不显示,它只是像70kb,我知道绝对不是多大的形象。

var bodyString: String = "session_id=\(session_id)&location_id=\(location_id)" bodyString = bodyString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! var body = NSMutableData.alloc() body.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) if image != nil{ var imageData = UIImageJPEGRepresentation(image,0.5) body = NSMutableData.alloc() //var imageDataString = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) bodyString = "session_id=\(session_id)&location_id=\(location_id)&image_data=" bodyString = bodyString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! body.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) var imageString = "&image_data=\(imageData)" body.appendData(imageData) } req.HTTPBody = body 

更新:所以我决定去base64的路线,但它似乎仍然没有工作我认为,因为我编码它作为ntf8string这是正确的方式做到这一点?

 var imageData = UIImageJPEGRepresentation(image,0.5) var imageDataString = imageData.base64EncodedStringWithOptions(.allZeros) body = NSMutableData.alloc() bodyString = "session_id=\(session_id)&location_id=\(location_id)&tag_type=\(tag_type)&image_data=\(imageDataString)" bodyString = bodyString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! body.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) 

并在后端我解码它像:

 image_data_decoded = base64.b64decode(image_data) 

你不能像这样在application/x-www-form-urlencoded请求中发布二进制数据。 实际上,你的问题中的代码看起来像会尝试发送二进制数据的hexstring表示,这可能不是你想要的,即使你打算这么做,(a)你将不得不解码它以某种方式在服务器端; (b)注意,这是非常低效的(超过图像有效负载的两倍):(c)需要在请求中百分比转义。 但是,我不认为你有这个意图,所以这可能是没有意义的。

通常要么创build这里概述的multipart/form-data请求(其中上传的文件作为一个文件进来,例如PHP中的$_FILES ),或者将这个二进制数据转换成文本(例如使用base64)和服务器代码已将image_data密钥的base64值转换回二进制数据。

顺便说一下,我可能会build议Alamofire或AFNetworking作为尝试正确创build请求的替代方法。 它不会改变潜在的问题(你必须在base64编码或多部分请求之间select),但它简化了Swift代码。