【问题标题】:Swift POST Request (Base64 Image) to PHP ScriptSwift POST 请求(Base64 图像)到 PHP 脚本
【发布时间】: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) 可能足以检查某种大小限制是否导致您的问题。

标签: php ios swift post


【解决方案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()

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

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多