You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:44:57