首页 > 解决方案 > 为什么 PHP 从 POST 发送的 LONG base64 图像中删除一些字符?

问题描述

我有一个 PHP 文件,用于将base64图像转换为实际图像files并将它们存储在我的服务器上。

arraybase64 图像通过应用POST程序发送到 PHP Swift iOS

但是,当我在服务器/PHP 上收到 base64 字符串时,base64 字符串中似乎缺少一些数据。它们似乎是+标志之类的东西。

例如:

这就是我在控制台客户端所拥有的:

/pKhpAXVAQlKriLxte79N9f8K2/7d+ZnCEU6uIjK7w3s7e61/G9zrPt5S+X2f//Z

但是当我在服务器上收到这个时,我得到了这个:

/pKhpAXVAQlKriLxte79N9f8K2/7d ZnCEU6uIjK7w3s7e61/G9zrPt5S X2f//Z

如果您注意到,似乎+缺少一些迹象。我在我的代码中的任何时候都没有删除任何内容。

那我为什么会遇到这个问题?

这是我的 PHP 代码:

$imagesArray = $_POST['imagesArray'];
$arr = json_decode($imagesArray, true);

foreach ($arr as $value) {
    $base64_string = "data:image/jpeg;base64,".$value;
    //$base64_string = preg_replace('/\s+/', '+', $base64_string);
    $fp = fopen("myText.txt","wb");
    fwrite($fp,$base64_string);
    fclose($fp);
}

我还尝试使用此代码$base64_string = preg_replace('/\s+/', '+', $base64_string);并将缺少的+符号添加回base64字符串中,我设法将base64图像转换为文件并将它们保存在服务器上但是当我查看保存的图像文件时,它们上有大量的灰线!

例如:

原始 base64 图像:

在此处输入图像描述

使用上面的代码将相同的图像转换为文件并保存在服务器上:

在此处输入图像描述

这是发送数据的 Swift 代码:

let request = NSMutableURLRequest(url: NSURL(string: "https://example.com/upload.php")! as URL)
request.httpMethod = "POST"

let postString = "imagesArray=\(String(describing: imagesArray))"
request.httpBody = postString.data(using: String.Encoding.utf8)

let task = URLSession.shared.dataTask(with: request as URLRequest) {
    data, response, error in

    if error != nil {
        print("error=\(String(describing: error))")
        return
    }

    //print("response = \(String(describing: response))")
    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
    let result = responseString!
    if (result != "success") {
        print(responseString!)
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.hideLoade()
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
            self.dismiss(animated: true, completion: nil)
            SCLAlertView().showSuccess("Success", subTitle: result as String)
        }
    } else {
        print(responseString!)
    }
}

task.resume()

标签: phpswift

解决方案


如评论中所述,base64 包含对 URL 而言“特殊”的字符,因此为了将 base64 放在 URL 上,您需要稍微修改编码以使其对 url 安全:

function base64url_encode($bin) {
        return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($bin));
}

function base64url_decode($str) {
        return base64_decode(str_replace(['-', '_'], ['+', '/'], $str));
}

我不确定等效的 Swift 代码是什么,但它应该很容易实现。

也就是说,将大量数据放入 URL 在很多方面存在问题,包括 URL 长度限制、将所有这些数据塞入服务器日志以及 base64 编码将数据大小增加 33 的事实%。

这绝对应该是一个 POST 或 PUT 请求,请求正文中包含图像数据,而不是 URL。


推荐阅读