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

如何使用Swift Alamofire通过URL将视频上传至服务器

嘿,看起来你已经搞定了视频选择的第一步,接下来用Alamofire实现multipart上传其实很顺畅!我给你写个完整的可运行示例,包含关键细节处理,帮你顺利把视频传到服务器。

完整实现代码

首先,你可以在拿到视频URL后直接调用上传方法,我把整个流程整合起来:

import Alamofire

class YourViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    // 打开相册选择视频的触发方法(假设你已经有对应的触发逻辑)
    func openVideoPicker() {
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .photoLibrary
        picker.mediaTypes = ["public.movie"] // 限制只允许选择视频
        present(picker, animated: true)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true)
        
        guard let videoURL = info[.mediaURL] as? URL else {
            print("无法获取有效视频URL")
            return
        }
        
        // 调用核心上传方法
        uploadVideoToServer(videoURL: videoURL)
    }
    
    // Alamofire视频上传核心实现
    private func uploadVideoToServer(videoURL: URL) {
        let serverUploadURL = "https://your-server-upload-endpoint.com/video" // 替换成你的真实服务器接口
        
        // 可选:自动获取视频的MIME类型,适配不同格式(mp4/mov等)
        let videoMIMEType = videoURL.mimeType ?? "video/mp4"
        
        Alamofire.upload(
            multipartFormData: { multipartFormData in
                // 添加上传的视频文件
                // 参数说明:
                // - name: 服务器端接收文件的字段名(比如后端用"uploaded_video"接收,这里就对应写)
                // - fileName: 用UUID生成唯一文件名,避免服务器文件重名,保留原后缀
                let uniqueFileName = "\(UUID().uuidString).\(videoURL.pathExtension)"
                multipartFormData.append(videoURL, withName: "uploaded_video", fileName: uniqueFileName, mimeType: videoMIMEType)
                
                // 如果需要附带额外参数(比如用户ID、视频描述),可以在这里添加
                // multipartFormData.append("user_1001".data(using: .utf8)!, withName: "user_id")
                // multipartFormData.append("summer_vlog".data(using: .utf8)!, withName: "video_desc")
            },
            to: serverUploadURL,
            method: .post,
            headers: ["Authorization": "Bearer your-auth-token"] // 若需身份验证,添加对应请求头
        ) { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                // 实时监听上传进度
                upload.uploadProgress(queue: .main) { progress in
                    print("当前上传进度: \(String(format: "%.1f", progress.fractionCompleted * 100))%")
                    // 这里可以更新UI,比如进度条显示
                }
                
                // 处理服务器响应
                upload.responseJSON { response in
                    switch response.result {
                    case .success(let responseData):
                        print("上传成功!服务器返回数据: \(responseData)")
                        // 这里处理成功后的逻辑,比如提示用户、刷新页面等
                    case .failure(let error):
                        print("上传失败,错误信息: \(error.localizedDescription)")
                        // 处理各类错误,比如网络异常、服务器错误等
                    }
                }
                
            case .failure(let error):
                print("Multipart数据编码失败,错误信息: \(error.localizedDescription)")
            }
        }
    }
}

// 扩展URL,方便自动获取文件MIME类型
extension URL {
    var mimeType: String? {
        let pathExtension = self.pathExtension
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as NSString, nil)?.takeRetainedValue() else {
            return nil
        }
        guard let mimeType = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() else {
            return nil
        }
        return mimeType as String
    }
}
关键细节说明
  • MIME类型适配:我加了一个URL扩展来自动识别视频的MIME类型,比硬编码video/mp4更灵活,能适配mov、avi等不同格式。
  • 唯一文件名:用UUID()生成不重复的文件名,避免服务器上的文件被覆盖。
  • 额外参数支持:如果你的上传接口需要附带用户ID、视频描述等参数,可以直接在multipartFormData里用append(_:withName:)添加。
  • 进度监听:通过uploadProgress可以实时获取上传进度,方便给用户展示直观的上传状态。
  • 错误覆盖:覆盖了编码失败、上传失败、响应失败等多种场景,方便你排查问题。
注意事项
  1. 确保你的项目已经正确集成Alamofire(可以通过CocoaPods或Swift Package Manager安装)。
  2. 别忘了在Info.plist中添加相册访问权限:NSPhotoLibraryUsageDescription,否则App会崩溃。
  3. 如果是超大视频,建议和后端协商分块上传(Alamofire也支持分块上传,小视频用上面的方法足够)。

内容的提问来源于stack exchange,提问作者Muneeb Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:41:57