I'm trying to download a pdf file using a link from an API but It's always downloaded with size 5 KB and always the file is corrupted and can't be opened, The link is working fine as I've tried it, my code:
import Foundation
import Alamofire
class DownloadOrderService {
static let shared = DownloadOrderService()
func downloadPDFOrder(orderID: Int, completion: @escaping(_ error: Error?)-> Void) {
let urlString = getJSON(strURL:"URL")
let destination: DownloadRequest.Destination = { _, _ in
let documentsURL:NSURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
debugPrint("***documentURL: ",documentsURL)
let fileURL = documentsURL.appendingPathComponent("\(orderID).pdf")
debugPrint("***fileURL: ",fileURL ?? "")
return (fileURL!,[.removePreviousFile, .createIntermediateDirectories])
}
AF.download(urlString,method: .get, encoding: JSONEncoding.default, to: destination).downloadProgress(closure: { (prog) in
}).response { response in
if response.error == nil {
debugPrint(response)
completion(nil)
}
else {
completion(response.error)
}
}
}
}
All the print statements I have in my code result and response as well :
"***documentURL: " file:///Users/mac/Library/Developer/CoreSimulator/Devices/71CB6514-5C19-423C-989C-B21F2CEFE65E/data/Containers/Data/Application/3F21E22E-469E-4BCD-8079-83BC4CE321F2/Documents/
"***fileURL: " file:///Users/mac/Library/Developer/CoreSimulator/Devices/71CB6514-5C19-423C-989C-B21F2CEFE65E/data/Containers/Data/Application/3F21E22E-469E-4BCD-8079-83BC4CE321F2/Documents/1007.pdf
[Request]: GET url
[Headers]: None
[Body]: None
[Response]:
[Status Code]: 200
[Headers]:
access-control-allow-headers: *
access-control-allow-methods: *
Access-Control-Allow-Origin: *
Cache-Control: no-cache, private
Content-Encoding: br
Content-Length: 1344
content-security-policy: upgrade-insecure-requests
Content-Type: text/html; charset=UTF-8
Date: Fri, 19 Nov 2021 20:25:54 GMT
Server: LiteSpeed
Set-Cookie: laravel_session=eyJpdiI6IjhPMFBvR2l6U2dwYk83OVIreWRqSUE9PSIsInZhbHVlIjoidU5yeEttN1BlQlRyXC9YVkh2d1RUYjJib3J1WkNtUUhVXC9oSVBzS08ybkhBYU9DT0tGaCtRbElBZzJiN2VRRFFvIiwibWFjIjoiYWQ2Y2UwZjhjZGI1MGUyYzg5MDNmOTA2YTVmNDI3MDZhM2JmZWM1NDFlOTRlZDY2NGFkNjk0MGQ5NTJjYTRjZSJ9; expires=Fri, 19-Nov-2021 22:25:54 GMT; Max-Age=7200; path=/; httponly; secure
Vary: Accept-Encoding
x-powered-by: PHP/7.4.11
[File URL]: /Users/mac/Library/Developer/CoreSimulator/Devices/71CB6514-5C19-423C-989C-B21F2CEFE65E/data/Containers/Data/Application/492B9611-A6BD-4456-BE3B-9E2419E11073/Documents/1007.pdf
[Resume Data]: None
[Network Duration]: 0.38273394107818604s
[Serialization Duration]: 0.0s
[Result]: success(Optional(file:///Users/mac/Library/Developer/CoreSimulator/Devices/71CB6514-5C19-423C-989C-B21F2CEFE65E/data/Containers/Data/Application/492B9611-A6BD-4456-BE3B-9E2419E11073/Documents/1007.pdf))
UPDATE: I've even created another function which leads me to the same issue again:
func savePdf(orderID: Int) {
let urlString = getJSON(strURL:"url")
DispatchQueue.main.async {
let pdfData = try? Data.init(contentsOf: urlString)
let resourceDocPath = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
let pdfNameFromUrl = "Orderatak-\(orderID).pdf"
let actualPath = resourceDocPath.appendingPathComponent(pdfNameFromUrl)
do {
try pdfData?.write(to: actualPath, options: .atomic)
}
catch {
debugPrint(error.localizedDescription)
}
}
}
CodePudding user response:
After some digging and trying different links, I've discovered that unfortunately, after checking with the backend dev, the issue was from the URL and both the codes above are working fine, you can just copy and paste them using your own URL, and don't forget to add the below attributes to your info.plist
and set them to YES to be able to find the downloaded files if you are running the app in real device:
- Supports opening documents in place
- Application supports iTunes file sharing