Alamofire uploadProgress回调未触发问题求助
上传进度回调未触发的解决方案
问题根源
你当前的实现是先将文件内容一次性读取到Data对象中,再添加到多部分表单数据里。这种情况下,Alamofire会直接把内存中的完整数据一次性发送给服务器,无法跟踪分块上传的进度,因此uploadProgress回调永远不会被触发。
修复方案
不要提前读取文件内容,直接将文件URL添加到多部分表单中,让Alamofire负责逐块读取并上传文件,这样就能正常触发进度回调。同时要注意安全作用域资源的释放时机,必须在表单数据构造完成后再停止访问。
修改后的代码如下:
do { let _ = fileUrl.startAccessingSecurityScopedResource() let pendingRequest = session.upload( multipartFormData: { multipartFormData in // 直接添加文件URL,而非预读取的Data try multipartFormData.append(fileUrl, withName: "file", fileName: fileUrl.lastPathComponent, mimeType: fileUrl.pathExtension) multipartFormData.append(typeOfDocument.data(using: .utf8)!, withName: "fileType") multipartFormData.append(customerId.data(using: .utf8)!, withName: "customerId") multipartFormData.append(fileId.data(using: .utf8)!, withName: "fileId") // 构造完成后停止访问安全作用域资源 fileUrl.stopAccessingSecurityScopedResource() }, to: url, method: .post, headers: headers ).uploadProgress(closure: { progress in print(progress.fractionCompleted) }).responseString { response in guard let data = response.data, let decodedModel = try? JSONDecoder().decode(UploadDocumentsResponse.self, from: data) else { completionHandler(.failure(.cannotDecode)) return } completionHandler(.success(decodedModel)) } return CancellableRequest(pendingRequest: pendingRequest) } catch let error { fileUrl.stopAccessingSecurityScopedResource() print(error) return nil }
额外验证点
- 确保服务器端支持分块上传的进度反馈(你的上传功能正常,这一点大概率没问题)
- 若仍有问题,可指定主队列执行进度回调,方便更新UI:
.uploadProgress(queue: .main) { progress in print(progress.fractionCompleted) // 这里可以直接更新UI进度条 }
内容的提问来源于stack exchange,提问作者Abdurakhmon
相关产品推荐
相关产品推荐

