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

POST base64 encoded image string to PHP

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

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

我的尝试:我尝试传递图像的 base64 编码字符串,就像我将字符串或 int 作为 POST 参数传递一样。我验证了 POST 数据已成功传送到 PHP 服务器,并且已保存在数据库中。但是,当我提取 base64 编码的字符串并对其进行解码以便可以在浏览器中呈现图像时,它不起作用。它只显示损坏的图像 link 而不是图像。似乎在 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

之前我向您推荐了 ,它显示了一种相当有限的战术解决方案,用于解决 base-64 字符串中存在 + 字符的问题。这包括用 %2B.

替换 + 字符

但我注意到您还在参数中包含了用户名和密码。这表明您确实需要一个更通用的解决方案,即转义所有保留字符的百分比。如果您不这样做,如果密码包含保留字符(例如 +&),这将不起作用。

像这样提交参数时,您应该对值进行百分号转义。例如,您可以将字符集定义为仅 "unreserved" 个字符(由 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)