将base64编码的图像字符串POST到PHP

时间:2015-04-12 13:52:58

标签: ios swift uiimageview base64

我阅读了很多帖子并观看了一些视频。

问题:我无法将base64字符串映像发布到PHP服务器并保存到MySQL数据库而不会损坏。

我尝试过:我尝试传递图像的base64编码字符串,就像传递字符串或int作为POST参数一样。我验证了POST数据成功进入PHP服务器并且它已保存在数据库中。但是,当我提取base64编码的字符串并对其进行解码以便可以在浏览器中呈现图像时,它不起作用。它仅显示损坏的图像链接而不是图像。似乎发生了一些破坏POST过程中数据的事情。我这样说是因为我直接从Xcode中的println()语句复制了base64字符串并将其粘贴到PHP文件中,在那里它被解码并完美显示。我能够完全从我的Android应用程序上传base64字符串的图像。问题似乎与我在Swift中的表现有关。

经过一些研究,我看到我可能需要在图像参数周围指定边界。我对此并不肯定,因为我不确定您是否只需要在直接发送图像文件时指定边界,或者在发送图像的base64编码字符串时也需要它。

有人能告诉我是否需要在将base64编码的字符串参数发送到PHP服务器之前设置边界?知道我可能做错了吗?

 let image: UIImage = imgProfilePic.image!

    let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.1, 0.1))
    let hasAlpha = false
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    var imageData = UIImageJPEGRepresentation(scaledImage, 0.9)
    let base64String = imageData.base64EncodedStringWithOptions(.allZeros)

    var cd = CoreDataUser(pstrContext: "this")

    var params = "strUsername=" + cd.getUsername()
    params = params + "&strPassword=" + cd.getPassword()
    params = params + "&blbProfilePic=" + base64String

1 个答案:

答案 0 :(得分:1)

之前我提到了https://stackoverflow.com/a/14803292/1271826,它显示了一个相当有限的战术解决方案,解决了base-64字符串中+个字符的存在问题。这包括用+替换%2B个字符。

但我注意到您还在参数中包含了用户名和密码。这表明你真的想要一个更通用的解决方案,百分之百逃避所有保留字符。如果您不这样做,如果密码包含保留字符(例如+&),则此功能无效。

提交这样的参数时,你应该百分之百地逃避这些值。例如,您可以将字符集定义为仅保留"无保留的"字符(由RFC 3986定义),即字母数字字符加上-._~

extension NSCharacterSet {
    class func URLQueryValueAllowedCharacterSet() -> NSCharacterSet {
        return NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~")
    }
}

然后你可以做类似的事情:

func percentEscapeString(string: String) -> String {
    return string.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryValueAllowedCharacterSet())!
}

或者,如果你喜欢旧的CFURLCreateStringByAddingPercentEscapes功能,你可以这样做:

func percentEscapeString(string: String) -> String {
    return CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
        string,
        nil,
        ":/?@!$&'()*+,;=",
        CFStringBuiltInEncodings.UTF8.rawValue) as! String;
}

前面的例子更直观,但后一种方法效率更高。

但不管你如何实现它,你现在可以使用这个函数来逃避你的字符串:

let params = "strUsername=" + percentEscapeString(cd.getUsername()) +
    "&strPassword=" + percentEscapeString(cd.getPassword()) +
    "&blbProfilePic=" + percentEscapeString(base64String)