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

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

Когда строка кода task.resume() работает, однако эта ошибка выдается:

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

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

Я прочитал несколько других сообщений об этой ошибке, и попытался выявить didFinishPickingMediaWithInfo объективно-с @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 скрипт:

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

0

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]