Swift POST 请求(Base64 图像)到 PHP 脚本

Posted

技术标签:

【中文标题】Swift POST 请求(Base64 图像)到 PHP 脚本【英文标题】:Swift POST Request (Base64 Image) to PHP Script 【发布时间】:2018-10-20 15:31:08 【问题描述】:

在阅读了许多类似的问题后,我仍然不明白问题出在哪里。

我正在尝试将 Base64 编码的图像发送到一个简单的 php 脚本,这是我的 Swift 代码:

func sendImage(encodedImage: String) 
    let url = URL(string: "http://www.site.whatever/image_upload.php")
    var request = URLRequest(url: url!)
    let postString = "encoded_image=\(encodedImage)"
    let postData = postString.data(using: String.Encoding.utf8)
    request.httpMethod = "POST"
    request.httpBody = postData
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    let task = URLSession.shared.dataTask(with: request) 
        data, response, error in
        if error != nil 
            // Handle error
            return
        
        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print(responseString)
    
    task.resume()

简单的 PHP 脚本

$request_method = $_SERVER["REQUEST_METHOD"];

switch ($request_method) 
    case 'POST':
        if (isset($_POST["encoded_image"])) 
            // POST parameter has been set successfully
            $return = ["POSTSET?" => "Yes"];
            echo json_encode($return);
        
    // POST parameter was not set
    $return = ["POSTSET" => "No"];
    echo json_encode($return);

问题:

让 postString = "encoded_image=\(encodedImage)"

编码图像的设置位置:

让encodedImage = image.pngData()!.base64EncodedString()

它返回"POSTSET?","No" // POST 没有发送

让 postString = "encoded_image=some_random_string"

它返回"POSTSET?","Yes" // POST 发送成功


在我尝试发送 Base64 之前,我不知道为什么它可以完美运行。

想法:

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 是正确的内容类型吗?

由于 Base64 字符串太长,我应该设置内容长度吗?

是否应该使用 String.Encoding.utf8 以外的方式对 request.httpBody 进行编码?

我的 PHP 是否应该期待与 Swift 发送的内容不同的内容?

任何见解都会有所帮助,谢谢。

【问题讨论】:

您的 Swift 代码还有其他问题(使用 application/x-www-form-urlencoded 发送的值需要进行 URL 编码),但我不确定这是否会导致 "POSTSET?","No"。您的 PHP 服务器是否配置为接收足够大小的 POST 数据?你的php.ini的post_max_size多少钱? 关于 post_max_size 变量 - 当我使用标准 <form action=“POST”> 提交数据时,它工作得很好,这表明页面可以处理长字符串长度,对吧? 没有。除非您提交与您的图像完全相同的 base64 字符串。你的信息会改变要检查的事情的优先级。但不确定。 我会检查最大帖子大小以防出现问题,谢谢@OOPer 这是我现在能想到的一种可能性。如果你直接检查有困难,你可以用一些随机字符串测试你的sendImage(encodedImage:),每一步增加x2(或更多)的长度,直到你的PHP服务器无法接收它或者大小超过了base64字符串图片。 let encodedImage = String(repeating: "A", count: n) 可能足以检查某种大小限制是否导致您的问题。 【参考方案1】:

我看到的 Base64 编码 PNG 的字符串长度平均约为 1200 万个字符。运行 PHP 脚本的服务器无法接受请求,会导致错误。

我改为向 API 发送 JPG,这样发送时 Base64 字符串接近 300 万。

let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
let imageData = image.jpegData(compressionQuality: 1)!
let encodedImage = imageData.base64EncodedString()

这成功发送了图像,允许我在后端解码并保存。

【讨论】:

以上是关于Swift POST 请求(Base64 图像)到 PHP 脚本的主要内容,如果未能解决你的问题,请参考以下文章

未通过 AJAX POST 请求发送大尺寸图像的 base64(作为 FormData 参数)

用于上传的 Swift 3 base64 编码图像

图像未通过 POST 完整传输到服务器

将图像转换为 Json Swift 3 的 Base64

将水印添加到图像(Base64)并进行转换

MiniMagick无法编写解码的Base64图像