Swift中下载Dropbox/Google Drive Zip文件后生成.cpgz文件的修复咨询
解决Dropbox/Google Drive Zip下载后循环解压成.cpgz的问题
你遇到的这个循环解压问题其实很好解决——你当前下载的根本不是真正的Zip文件!Dropbox默认的分享链接(末尾带dl=0)返回的是网页预览页面,不是原始压缩包,所以解压时才会变成.cpgz文件,陷入死循环。
我直接给你修改好的Swift代码,同时解释关键改动点:
if let zipUrl = URL(string: "https://www.dropbox.com/s/n785nwy2tbaxgz8/app_dfu_package_1.zip?dl=1") { // 关键改动1:把dl=0改成dl=1 // 获取Documents目录URL let documentsUrl = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) // 目标文件保存路径 let destination = documentsUrl.appendingPathComponent(zipUrl.lastPathComponent) // 检查文件是否已存在 if FileManager().fileExists(atPath: destination.path) { print("文件已存在") } else { var urlRequest = URLRequest(url: zipUrl) urlRequest.httpMethod = "GET" // 关键改动2:移除不必要的Content-Type请求头,我们是下载文件不是提交JSON URLSession.shared.downloadTask(with: urlRequest, completionHandler: { (location, response, error) in guard let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200, let location = location, error == nil else { print("下载失败:\(error?.localizedDescription ?? "未知错误")") return } do { try FileManager.default.moveItem(at: location, to: destination) print("文件已保存到:\(destination.path)") } catch { print("保存文件失败:\(error.localizedDescription)") } }).resume() } }
关键改动说明:
- 修正Dropbox链接参数:将链接末尾的
dl=0改为dl=1,这个参数告诉Dropbox直接返回原始压缩文件,而不是网页预览页面 - 移除错误的请求头:原代码中设置的
Content-Type: application/json完全没必要,我们是下载文件,不是向服务器提交JSON数据,这个头会干扰服务器的正确响应 - 额外提示(针对Google Drive):如果是Google Drive的分享链接,需要把格式从
https://drive.google.com/open?id=XXX改成https://drive.google.com/uc?export=download&id=XXX,才能直接下载原始文件
这样修改后,你下载到的就是真正的Zip包,解压时就不会再出现.cpgz循环的问题了。
内容的提问来源于stack exchange,提问作者Jitendra
相关产品推荐
相关产品推荐

