【问题标题】:uploading image in swift with multiple parameters使用多个参数快速上传图像
【发布时间】:2015-07-12 10:21:27
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • 好的,这样更好。有几件事:首先,不要使用NSMutableData.alloc()。只是NSMutableData()。 2. 您应该查看bodyString 并确保它看起来不错(即这些变量都不是可选项,最终将Optional(...) 插入到您的字符串中。3. 您可能想使用Charles 之类的东西来查看根据实际请求并确保没问题。您还没有分享NSMutableURLRequest的完整配置,因此我们无法对此发表评论。
  • 在服务器端,是 PHP 吗?我不熟悉base64.b64decode。在 PHP 中,我倾向于使用base64_decode。无论如何,您可能想要检查 image_data 并确保它没有受到干扰,然后确认 image_data_decoded 产生的确切内容。

标签: ios swift network-programming


【解决方案1】:

您不能像这样在application/x-www-form-urlencoded 请求中发布二进制数据。实际上,您问题中的代码看起来会尝试发送二进制数据的十六进制字符串表示形式,这可能不是您想要的,即使您确实打算这样做,(a)您也必须对其进行解码不知何故在服务器端; (b) 请注意,这是非常低效的(图像有效负载的大小增加了一倍多):并且 (c) 需要在请求中进行百分比转义。但无论如何,我认为你根本不是故意的,所以这可能完全没有实际意义。

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

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

【讨论】:

  • 感谢您...仍然无法使用 base64 编码使其正常工作。我用当前代码更新了我的问题。还可以将它作为 multipart/form-data 进行,这样可以更快地上传吗?我是否可以使用 base64 方式(不超过 10 秒)上传视频,还是需要对视频使用多部分表单?
  • 回复multipart/form-data 更快?我怀疑是这样,因为你的十六进制字符串技术会使它变大 100%,甚至 base64 也会变大 33%。通过使用multipart/form-data,payload 不会被放大以将其转换为文本友好格式(此外,在处理大型上传时,服务器代码更简单、更健壮)。
  • 好的,让它与多部分一起工作。一旦我走上正确的轨道就容易多了,谢谢!
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多