我已经阅读了许多帖子,并观看了一些视频。

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

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

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

谁能告诉我在发送给PHP服务器之前是否需要在base64编码的字符串参数周围设置边界?知道我做错了什么吗?

 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

最佳答案

之前我提到过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)

关于ios - POST base64编码的图像字符串到PHP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29590195/

10-12 00:34
查看更多