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 脚本的主要内容,如果未能解决你的问题,请参考以下文章