尝试运行任务时,发送图像,收到错误代码=13“查询已取消”

Posted

技术标签:

【中文标题】尝试运行任务时,发送图像,收到错误代码=13“查询已取消”【英文标题】:When trying to run a task, sending an image, getting error Code=13 "query cancelled" 【发布时间】:2018-10-12 11:12:44 【问题描述】:

我目前正在使用 ios 应用程序的图像选择器从相机角色中获取图片,然后尝试将其发送到 Web 服务器上的 php 脚本以将图像保存到另一端。

但是,当task.resume()这行代码运行时,会抛出这个错误:

发现扩展时遇到[discovery] 错误:Error Domain=PlugInKit Code=13 "query cancelled" UserInfo=NSLocalizedDescription=query cancelled

发生这种情况后,图像也不会保存在目的地。

我已阅读有关此错误的其他几篇帖子,并尝试使用@objcdidFinishPickingMediaWithInfo 暴露给objective-c。

我已在 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"
        ]);
    

【问题讨论】:

请求实际上是从 iOS 发出的,你看到 progressLabel 更新了吗? @DávidPásztor progressLabel 得到更新,从 0% 到 100%,而 progressView 也相应更新。 我也明白了,尽管一切正常。我希望我能解释发生了什么,但我不能相反,如果你在这里查看第二个答案:***.com/questions/44465904/… 你会找到一种在控制台中压制它的方法。 (并且对此答案的评论与我一致,它没有解释它是什么。我通常会启用此变量,直到我完成并想要存档/上传到 App Store。我有两个应用程序被接受 - 和我相信这是 Xcode 9 开始出现的。 @dfd 所以这个错误不会影响你的任何进程?如果是这种情况,它可能与我的图像无法保存的问题无关。我会仔细检查服务器端的所有内容,谢谢。 具体来说,我使用的是UIImagePickerController,一切正常。解雇它时我得到这个“错误”。我目前正在浏览我发布的链接中的所有答案,但到目前为止都没有奏效。 【参考方案1】:

所以事实证明我的问题不是由这个错误引起的,而且似乎该错误实际上对代码没有任何影响 - 似乎可以忽略它。

就我而言,由于我的疏忽,代码无法正常工作。我尝试发送的图像为 2.2MB,但我没有意识到它返回了 html 错误代码 413,因为我正在测试的服务器上的上限为 2MB。

如果您遇到此类任务失败的问题,请确保在 urlSession 的 didReceive response 函数中打印出 response。这样您就可以检查返回的任何 HTML 错误。

【讨论】:

以上是关于尝试运行任务时,发送图像,收到错误代码=13“查询已取消”的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试提交表单以存储某些值和上传图像的路径到数据库时,我收到[对象引用未设置...]的错误[复制]

尝试查询数据库时收到错误“未选择数据库”[关闭]

为啥我在尝试从 C# 处理程序发布 GraphQL 查询时收到错误请求?

为啥我在运行查询时收到错误 -4700(尝试使用新功能模式)?

Golang:在文本文件中发送查询时“函数结束时缺少返回”

更新到 Xcode 13,尝试在 iOS 但不是 macOS 上运行 SwiftUI 应用程序时获得唯一的错误代码