В настоящее время я использую средство выбора изображений для приложения 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"]);
}
Таким образом, оказывается, что моя проблема не была вызвана этой ошибкой, и кажется, что ошибка на самом деле не влияет на код — кажется, ее можно игнорировать.
В моем случае код не работал из-за недосмотра с моей стороны. Изображение, которое я пытался отправить, было 2,2 МБ, и я не осознавал, что оно возвращает код ошибки HTML 413, поскольку на сервере, который я тестировал, ограничение составляет 2 МБ.
Если у вас возникли проблемы с такой задачей, которая не выполняется, обязательно распечатайте response
в didReceive response
функция urlSession. Таким образом, вы можете проверить любые ошибки HTML, которые возвращаются.
Других решений пока нет …