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

时间:2018-10-20 15:31:09

标签: php ios swift post

在阅读了许多类似的问题之后,我仍然不明白这里是什么问题。

我正在尝试将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);
}

问题:

使用

let postString = "encoded_image=\(encodedImage)"

其中的encodingImage设置为:

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

它返回{"POSTSET?","No"} // POST未发送

使用

let postString = "encoded_image=some_random_string"

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


在尝试发送Base64之前,我不知道为什么它能完美工作。

想法:

  

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

     

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

     

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

     

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

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

1 个答案:

答案 0 :(得分:0)

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

我发送了JPG到API,这样发送的Base64字符串接近300万。

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

这成功发送了图像,使我可以解码并保存在后端。