使用Alamofire上传视频报错:提供的URL被识别为目录
解决Alamofire上传视频时“提供的URL是一个目录”错误
问题原因
- 视频URL获取逻辑错误:
mediaURL本身就是指向视频文件的URL,无需额外获取filePathURL,原代码的类型转换和路径处理导致最终传递的路径无效 - 上传时URL解析错误:使用
URL(string:)处理本地文件URL字符串(带file://前缀)容易出问题,应该直接使用URL类型参数,或用URL(fileURLWithPath:)处理本地路径字符串 - 硬编码文件名不严谨:应该从视频URL中自动提取文件名,避免手动输入错误
修正后的代码
1. 正确获取视频URL
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { self.dismiss(animated: true) // 直接获取视频文件URL,无需转NSURL guard let videoURL = info[.mediaURL] as? URL else { print("无法获取视频URL") return } // 调用上传方法,直接传URL let parameters: Parameters = ["key1": "value1", "key2": "value2"] // 替换成你的业务参数 uploadPostFiles(videoURL: videoURL, parameters: parameters) }
2. 修正上传方法
func uploadPostFiles(videoURL: URL, parameters: Parameters) { AF.upload(multipartFormData: { multipartFormData in // 直接使用视频URL追加文件,Alamofire会自动处理文件内容 // 从URL中提取文件名和后缀 let fileName = videoURL.lastPathComponent let mimeType = "video/mp4" do { try multipartFormData.append(videoURL, withName: "file", fileName: fileName, mimeType: mimeType) } catch { print("追加视频文件失败:\(error.localizedDescription)") return } // 追加其他参数 for (key, value) in parameters { if let temp = value as? String { multipartFormData.append(temp.data(using: .utf8)!, withName: key) } } }, to: "\(ApiConstant.BASE_URL)/upload", method: .post, headers: getHeaders()) .validate(statusCode: 200..<500) .response { response in guard let data = response.data, let statusCode = response.response?.statusCode, statusCode == 200 else { print("请求失败:\(response.error?.localizedDescription ?? "未知错误")") return } do { let users = try JSONDecoder().decode(GetPostModel.self, from: data) debugPrint(users) if users.status { // 上传成功逻辑 } else { // 服务器返回失败逻辑 } } catch let error as NSError { print("解析失败:\(error.localizedDescription)") } } }
关键说明
- 直接传递
URL类型给上传方法,避免字符串转URL的解析错误 - 使用
multipartFormData.append(_ url: URL, ...)的重载方法,Alamofire会自动读取文件内容,无需手动处理路径 - 从
videoURL.lastPathComponent自动获取文件名,避免硬编码导致的错误 - 增加错误捕获和打印,方便调试问题
内容的提问来源于stack exchange,提问作者Afroz Alam
相关产品推荐
相关产品推荐

