При попытке запустить задачу, отправив изображение, получаю ошибку Code = 13 «запрос отменен» - PullRequest
0 голосов
/ 12 октября 2018

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

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

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

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

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

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

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

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 Script:

<?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"
        ]);
    }

1 Ответ

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

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

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

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

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