ios - 使用多个参数快速上传图像

标签 ios swift network-programming

我正在尝试使用 swift 将图像上传到后端客户端。问题是我似乎无法为 httpbody 设置正确的格式。我不想使用多部分表单进行上传,因为我不知道如何在后端处理它。

这是我的代码。当我在线查看图像时它不起作用,它不显示,它只有 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 请求中发布二进制数据。实际上,您问题中的代码看起来会尝试发送二进制数据的十六进制字符串表示形式,这可能不是您想要的,即使您确实打算这样做,(a)您也必须对其进行解码不知何故在服务器端; (b) 请注意,这是非常低效的(图像负载大小的两倍多):并且 (c) 需要在请求中进行百分比转义。但无论如何,我认为您根本没有这个打算,所以这可能没有实际意义。

人们通常会创建 multipart/form-data 请求,如 here 所述(其中上传的文件作为文件出现,例如 PHP 中的 $_FILES),或者将此二进制数据转换为文本(例如使用 base64)并且服务器代码已转换 base64 值为 image_data 键返回二进制数据。

顺便说一句,我可能会建议将 Alamofire 或 AFNetworking 作为尝试正确创建请求的替代方法。它不会改变根本问题(您必须在 base64 编码或多部分请求之间进行选择),但它简化了 Swift 代码。

关于ios - 使用多个参数快速上传图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006290/

相关文章:

iOS位置转换

swift - 为什么访问具有父关系的子类 NSManagedObject 的字符串参数会崩溃?

c - "Connected"UDP套接字,双向通信?

java - Java通信中C客户端中的TCP服务器

ios - 将来自服务器的 UTC 日期存储在 NSDate 对象中

ios - 如何判断 UITextView 脏了?

ios - 应用程序 :didFinishLaunchingWithOptions: not getting called on iPad

ios - 使用 'vendored_frameworks' 和 'source_files' 用于 cocoapod 使用 'use_frameworks!'

ios - 评估 UITraitCollection 的 hasDifferentColorAppearance(与 :) result 相比

c - 将 WireShark 集成到我的应用程序中