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

如何获取相册视频URL并解决Firebase上传错误?

解决从相册选视频上传Firebase Storage的URL错误问题

你代码的核心问题是没有获取到相册中选中视频的真实URL,反而自己生成了一个Documents目录下的空文件路径,Firebase找不到要上传的文件,因此抛出了文件不可达的错误。以下是修正方案:

关键修正点

  • 从UIImagePickerController的回调字典中,通过UIImagePickerController.InfoKey.mediaURL取出选中视频的真实URL
  • 上传时传入正确的视频URL,同时传递设置好的metadata(你之前传了nil,会导致Content-Type配置失效)
  • 给生成的视频文件名加上后缀(比如.mov),避免文件类型识别问题

修正后的完整代码

@IBAction func showImagePicker() {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = false
    picker.sourceType = .savedPhotosAlbum
    picker.mediaTypes = [kUTTypeMovie as String]
    picker.videoQuality = .typeIFrame1280x720
    self.present(picker, animated: true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true, completion: nil)
    
    // 获取选中视频的真实URL
    guard let selectedVideoURL = info[.mediaURL] as? URL else {
        print("无法获取选中的视频URL")
        return
    }
    
    let videoName = UUID().uuidString + ".mov" // 添加视频后缀,确保文件类型正确
    let metadata = StorageMetadata()
    metadata.contentType = "video/quicktime"
    let storageRef = storage.reference()
    let videoRef = storageRef.child("videos/\(videoName)")
    
    // 直接上传选中的视频
    videoRef.putFile(from: selectedVideoURL, metadata: metadata) { (metadata, error) in
        guard let metadata = metadata else {
            print("上传失败: \(error?.localizedDescription ?? "未知错误")")
            return
        }
        print("上传完成,返回元数据: \(metadata)")
        
        // 获取视频下载URL
        videoRef.downloadURL { (url, error) in
            guard let downloadURL = url else {
                print("生成下载URL失败: \(error?.localizedDescription ?? "未知错误")")
                return
            }
            print("视频下载URL: \(downloadURL.absoluteString)")
        }
    }
}

可选:将视频复制到App沙盒后上传

如果需要把视频保存到自己的App Documents目录再上传,可添加以下复制逻辑:

// 在获取selectedVideoURL之后添加
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let destinationURL = documentsURL.appendingPathComponent(videoName)

do {
    try FileManager.default.copyItem(at: selectedVideoURL, to: destinationURL)
    // 用destinationURL替代selectedVideoURL进行上传
    videoRef.putFile(from: destinationURL, metadata: metadata) { ... }
} catch {
    print("复制视频失败: \(error.localizedDescription)")
}

内容的提问来源于stack exchange,提问作者Big Jelly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:40:28