Загрузите файл pdf, используя ошибку ответа Alamofire url - PullRequest
0 голосов
/ 11 июня 2018

Я хочу скачать PDF-файл url, я использовал этот код:

class func downloadPdf(pdfReport: String, completion: @escaping (_ error: Error?, _ success: Bool,_ value: String) -> Void) {

    let downloadUrl: String = URLs.pdfFileUrl + pdfReport
    let destination = DownloadRequest.suggestedDownloadDestination()

    print(downloadUrl, destination)
    Alamofire.download(downloadUrl, method: .get, parameters: nil, encoding: JSONEncoding.default, to: destination).responseJSON { response in

        switch response.result {
        case .failure(let error):
            print("error: ", error)
            print(error.localizedDescription)
            completion(error, false, "")
        case .success(let value):
            let json = JSON(value)
            print(json)
            print("successss")
            completion(nil, true, "")
        }
    }
}

и в контроллере представления:

func downloadPdf() {
    KRProgressHUD.show(withMessage: NSLocalizedString("wait", comment: "wait"))
    API.downloadPdf(pdfReport: self.report.report){ (error: Error?, success: Bool, result: String) in
        if success {
            KRProgressHUD.dismiss()
        } else {
            KRProgressHUD.dismiss()
            if (!Connectivity.isConnectedToNetwork()){
                Toast.toast(messsage: NSLocalizedString("no internet", comment: "no internet"), view: self.view)
            } else {
                Toast.toast(messsage: NSLocalizedString("error occured", comment: "error occured"), view: self.view)
            }
        }
    }
}

при первом вызове метода downloadPdfон успешно загрузил файл, но я получил эту ошибку:

https://madrasty.dev.ibtdi.work/public/reports/15287105135b1e4571f2596-new.pdf (Функция) ошибка: responseSerializationFailed (Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed (Ошибка домена = NSCocoaErrorDomain Code = 3840 "Invalidзначение около символа 0. "UserInfo = {NSDebugDescription = Недопустимое значение вокруг символа 0.})) Не удалось сериализовать JSON из-за ошибки: تعذرت قراءة البيانات نظرًا لأن تنسيقها غير صحيح.

, если 1015 *1014*Метод снова я получил эту ошибку:

ошибка: Ошибка домена = NSCocoaErrorDomain Code = 516 "تعذر نقل" CFNetworkDownload_WBV95z.tmp "ىلى" Документы "نظرًا لوجود عنصر بنفس الUserInfo = {NSSourceFilePathErrorKey = / Users / ibtdi / Library / Developer / CoreSimulator / Devices / 10CB5B13-42C2-4646-934C-67FD33C948C5 / данные / Контейнеры / Data / Application / F894940C-0D55-4953-A9FA-E852C1C4B440 / TMP / CFNetworkDownload_WBV95z.tmp, NSUserStringVariant = (Переместить), NSDestinationFilePath = / Пользователи / ibtdi / Библиотека / Разработчик / CoreSimulator / Устройства / 10CB5B13-42C2-4646-934C-67FD33C948C5 / data / Containers / Data / Application / F894940C-0D55-4945240A9A9/Documents/15287105135b1e4571f2596-new.pdf, NSFilePath = / Users / ibtdi / Библиотека / Разработчик / CoreSimulator / Устройства / 10CB5B13-42C2-4646-934C-67FD33C948C5 / данные / контейнеры / данные / приложение / F894940--0D955E852C1C4B440 / tmp / CFNetworkDownload_WBV95z.tmp, NSUnderlyingError = 0x604000254460 {Ошибка домена = NSPOSIXErrorDomain Code = 17 «Файл существует»}}* эта ошибка, потому что есть файл в том же каталоге с тем же именем, я пыталсяиспользуйте responseString вместо responseJSON, но это не решает мою проблему, что мне делать?

1 Ответ

0 голосов
/ 11 июня 2018

В вашем коде есть несколько ошибок:

  1. Это задача Data, а не JSON, как указано Vadian.

ИзменитьФункция загрузки к этому:

func downloadPdf(pdfReport: String, uniqueName: String, completionHandler:@escaping(String, Bool)->()){

    let downloadUrl: String = URLs.pdfFileUrl + pdfReport
    let destinationPath: DownloadRequest.DownloadFileDestination = { _, _ in
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0];
        let fileURL = documentsURL.appendingPathComponent("\(uniqueName).pdf")
        return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    }
    print(downloadUrl)
    Alamofire.download(downloadUrl, to: destinationPath)
        .downloadProgress { progress in

        }
        .responseData { response in
            print("response: \(response)")
            switch response.result{
            case .success:
                if response.destinationURL != nil, let filePath = response.destinationURL?.absoluteString {
                    completionHandler(filePath, true)
                }
                break
            case .failure:
                completionHandler("", false)
                break
            }

    }
}

Ваша ошибка:

Error Domain=NSPOSIXErrorDomain Code=17 "File exists"

четко говорит о том, что в этом filePath уже есть файл.Так что этот код удалит предыдущий файл, если он есть.

...