При попытке запустить задачу, отправка изображения, получение кода ошибки = 13, запрос отменен

В настоящее время я использую средство выбора изображений для приложения iOS, чтобы получить изображение из роли камеры, а затем пытаюсь отправить его на PHP-скрипт на веб-сервере, чтобы сохранить изображение на другом конце.

Однако при выполнении строки кода task.resume() выдается эта ошибка:

[обнаружение] ошибки, обнаруженные при обнаружении расширений: Error Domain=PlugInKit Code=13 "запрос отменен" UserInfo={NSLocalizedDescription=запрос отменен}

Изображение также не сохраняется в месте назначения после того, как это произойдет.

Я прочитал несколько других сообщений об этой ошибке и попытался представить didFinishPickingMediaWithInfo для target-c с помощью @objc.

У меня есть конфиденциальность - описание использования библиотеки фотографий, назначенное в plist. Я также разрешил произвольные загрузки.

Несмотря на все это, ошибка все еще возникает, поэтому, если кто-нибудь заметит что-то не так с моим кодом, это очень поможет. Я также добавлю PHP-скрипт, чтобы вы могли видеть, куда отправляются данные, спасибо.

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, URLSessionDelegate, URLSessionTaskDelegate, URLSessionDataDelegate {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var uploadButton: UIButton!
    @IBOutlet weak var progressView: UIProgressView!
    @IBOutlet weak var progressLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        checkPermission()
    }

    func checkPermission() {
        let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        switch photoAuthorizationStatus {
        case .authorized:
            print("Access is granted by user")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization({
                (newStatus) in
                print("status is \(newStatus)")
                if newStatus ==  PHAuthorizationStatus.authorized {
                    /* do stuff here */
                    print("success")
                }
            })
            print("It is not determined until now")
        case .restricted:
            // same same
            print("User do not have access to photo album.")
        case .denied:
            // same same
            print("User has denied the permission.")
        }
    }

    @IBAction func uploadTapped(_ sender: UIButton) {
        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        pickerController.sourceType = UIImagePickerController.SourceType.photoLibrary

        self.present(pickerController, animated: true, completion: nil)
    }

    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        imageView.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage

        imageView.backgroundColor = UIColor.clear
        self.dismiss(animated: true, completion: nil)

        uploadImage()
    }

    func uploadImage() {
        let imageData = imageView.image!.jpegData(compressionQuality: 1)

        if imageData == nil {
            return
        }

        self.uploadButton.isEnabled = false

        let uploadScriptURL = NSURL(string: "I've removed the URL for this question, but a valid URL to the PHP goes here")
        var request = URLRequest(url: uploadScriptURL! as URL)
        request.httpMethod = "POST"
        request.setValue("Keep-Alive", forHTTPHeaderField: "Connection")

        let configuration = URLSessionConfiguration.default
        let session = URLSession(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)

        let task = session.uploadTask(with: request, from: imageData!)
        print(imageData!)
        task.resume()
    }

    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        let alert = UIAlertController(title: "Alert", message: error?.localizedDescription, preferredStyle: .alert)
        self.present(alert, animated: true, completion: nil)
        self.uploadButton.isEnabled = true
    }

    func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
        let uploadProgress:Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
        progressView.progress = uploadProgress
        let progressPercent = Int(uploadProgress * 100)
        progressLabel.text = "\(progressPercent)%"
    }

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
        self.uploadButton.isEnabled = true
    }
}

PHP-скрипт:

<?php
    $target_dir = "uploads";
    if(!file_exists($target_dir))
    {
        mkdir($target_dir, 0777, true);
    }
    $target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]);
    if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) {
        echo json_encode([
            "Message" => "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.",
            "Status" => "OK"
        ]);
    } else {
        echo json_encode([
            "Message" => "Sorry, there was an error uploading your file.",
            "Status" => "Error"
        ]);
    }

person Ethan Humphries    schedule 12.10.2018    source источник
comment
Действительно ли запрос делается из iOS, вы видите, что progressLabel обновляется?   -  person Dávid Pásztor    schedule 12.10.2018
comment
@DávidPásztor progressLabel обновляется с 0% до 100%, в то время как progressView также обновляется соответственно.   -  person Ethan Humphries    schedule 12.10.2018
comment
Я тоже это понимаю, хотя все работает исправно. Я хотел бы объяснить, что происходит, но я не могу Вместо этого, если вы посмотрите на второй ответ здесь: stackoverflow.com/questions/44465904/ вы найдете способ подавить его в консоли. (И комментарий к этому ответу согласен со мной, он не объясняет, что это такое. Обычно я оставляю эту переменную включенной до тех пор, пока не закончу и не захочу заархивировать/загрузить в App Store. У меня есть два приложения, которые были приняты — и Я считаю, что это Xcode 9, где это начало появляться.   -  person dfd    schedule 12.10.2018
comment
@dfd Значит, эта ошибка не влияет на ваши процессы? Если это так, это может быть не связано с проблемой, из-за которой мое изображение не сохраняется. Я проверю все на стороне сервера, спасибо.   -  person Ethan Humphries    schedule 12.10.2018
comment
Если быть точным, я использую UIImagePickerController, и все работает нормально. Я получаю эту ошибку при увольнении. В настоящее время я просматриваю все ответы по ссылке, которую я разместил, и пока ни один из них не сработал.   -  person dfd    schedule 12.10.2018
comment
Странно, что, похоже, нет реального определения того, что вызывает ошибку, но если это, похоже, ни на что не влияет, я попытаюсь отладить весь процесс и посмотреть, смогу ли я найти что-нибудь, что может нарушить процесс.   -  person Ethan Humphries    schedule 12.10.2018


Ответы (1)


Итак, моя проблема не была вызвана этой ошибкой, и кажется, что ошибка на самом деле не влияет на код - кажется, ее можно игнорировать.

В моем случае код не работал из-за недосмотра с моей стороны. Размер изображения, которое я пытался отправить, составлял 2,2 МБ, и я не знал, что оно возвращает код ошибки HTML 413 из-за того, что на тестируемом сервере ограничение составляло 2 МБ.

Если у вас возникли проблемы с выполнением такой задачи, обязательно распечатайте response в функции didReceive response urlSession. Таким образом, вы можете проверить любые возвращаемые HTML-ошибки.

person Ethan Humphries    schedule 12.10.2018