在阅读了许多类似的问题之后,我仍然不明白这里是什么问题。
我正在尝试将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发送的内容有所不同?
任何见解都会有所帮助,谢谢。
答案 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()
这成功发送了图像,使我可以解码并保存在后端。