Swift iOS端下载PDF体积过小损坏无法打开问题求助
问题根因
从你提供的响应日志就能直接定位问题:返回的Content-Type: text/html; charset=UTF-8,且Content-Length仅为1344字节,说明你请求拿到的根本不是PDF文件,是HTML页面,所以存下来的文件只有几KB、无法打开。
具体问题说明
- Alamofire请求配置错误:你给GET请求加了
encoding: JSONEncoding.default配置,GET请求的参数需要拼接在URL路径中,放在请求Body里后端不会识别,会直接返回错误页面。 - 缺少必要鉴权信息:你单独验证链接时,浏览器自动携带了已登录的Cookie信息所以能正常下载,但代码发起请求时没有携带对应的鉴权凭证(Token或Cookie),后端返回了登录页/错误提示页的HTML内容,就是你拿到的损坏文件。
- 第二个
Data(contentsOf:)的实现本身就是同步阻塞方法,不适合做网络请求,同时也没有携带鉴权信息,所以也复现了同样的故障。
修复方案
1. 修正Alamofire请求配置
移除GET请求多余的JSONEncoding配置,添加必要的鉴权头,指定接受PDF格式返回:
import Foundation import Alamofire class DownloadOrderService { static let shared = DownloadOrderService() func downloadPDFOrder(orderID: Int, completion: @escaping(_ error: Error?)-> Void) { let urlString = getJSON(strURL:"URL") // 替换为你实际的鉴权头,比如Bearer Token或者Cookie字段 let headers: HTTPHeaders = [ "Authorization": "Bearer 你的用户登录Token", "Accept": "application/pdf" ] let destination: DownloadRequest.Destination = { _, _ in let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let fileURL = documentsURL.appendingPathComponent("\(orderID).pdf") return (fileURL,[.removePreviousFile, .createIntermediateDirectories]) } AF.download(urlString, method: .get, headers: headers, to: destination).downloadProgress(closure: { prog in // 可自行处理下载进度 }).response { response in // 可打印返回头验证是否正确拿到PDF debugPrint("响应状态码:\(response.response?.statusCode ?? 0)") debugPrint("返回Content-Type:\(response.response?.headers["Content-Type"] ?? "")") completion(response.error) } } }
2. 调试确认返回内容
如果修改后仍然异常,可以先调用普通接口请求打印返回的字符串内容,确认返回的不是错误页面:
AF.request(urlString, method: .get, headers: headers).responseString { response in debugPrint("接口返回内容:\(response.value ?? "")") }
内容的提问来源于stack exchange,提问作者Menaim
相关产品推荐
相关产品推荐

