如何获取相册视频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
相关产品推荐
相关产品推荐

