Прочитав множество похожих вопросов, я все еще не понимаю, в чем здесь проблема.
Я пытаюсь отправить закодированное изображение 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)"
Где encodedImage устанавливается с:
let encodedImage = image.pngData()!.base64EncodedString()
возвращается {"POSTSET?","No"}
// POST не был отправлен
С
let postString = "encoded_image=<b>some_random_string</b>"
возвращается {"POSTSET?","Yes"}
// POST успешно отправлен
Я не знаю, почему это работает отлично, пока я не попытаюсь отправить Base64.
Мысли:
Естьrequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
правильный тип контента?
Должен ли я устанавливать длину контента, поскольку строка Base64 такая длинная?
Должно ли request.httpBody
быть закодировано с использованием чего-то отличного от String.Encoding.utf8
?
Должен ли мой PHP ожидать чего-то отличного от того, что посылает Swift?
Любое понимание будет полезным, спасибо.