Быстрый POST-запрос (изображение Base64) в PHP-скрипт - PullRequest
0 голосов
/ 20 октября 2018

Прочитав множество похожих вопросов, я все еще не понимаю, в чем здесь проблема.

Я пытаюсь отправить закодированное изображение 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?

Любое понимание будет полезным, спасибо.

1 Ответ

0 голосов
/ 22 октября 2018

Длина строки, которую я видел для PNG в кодировке Base64, составляла в среднем около 12 миллионов символов.Сервер, на котором работает PHP-скрипт, не способен принять запрос и может привести к ошибке.

Вместо этого я отправил JPG в API, строка Base64 при отправке выглядит ближе к 3 миллионамthis.

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

Это успешно отправляет изображение, что позволяет мне декодировать и сохранить на сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...