如何使用Swift在Firebase中存储视频?现有图片上传代码改造
实现Firebase Storage视频上传功能(基于现有图片上传代码改造)
问题描述
我已经有一个能将图片上传至Firebase Storage的函数,现在想实现视频上传功能。我猜需要把UIImage和.jpg换成对应的视频类型,但不知道视频对应的类型是什么?
原图片上传相关代码
状态变量
@State var pickedImages: [UIImage] = [] @State var retrievedImages = [UIImage]()
图片上传函数
func uploadImage() { // Create storage reference let storageRef = Storage.storage().reference() // Turn our image into data let selectedImage = pickedImages[0] let imageData = selectedImage.jpegData(compressionQuality: 0.8) guard imageData != nil else { let er = "THIS: Error while converting to data" return print(er) } // Specifie filepath and name let path = "images/\(UUID().uuidString).jpg" let fileRef = storageRef.child(path) // Upload that data let uploadTask = fileRef.putData(imageData!, metadata: nil) {metaData, error in print("THIS: from uploadTAsk") // Check for errors if error == nil && metaData != nil { // Save reference in firestore DB let db = Firestore.firestore() db.collection("images").document("user1").setData(["url": path]) { error in print("THIS: inside closure") // If there was no errors, display the image if error == nil { DispatchQueue.main.async { self.retrievedImages.append(selectedImage) } } } } } }
视频上传改造方案
核心修改点
- 替换数据类型:视频不需要用
UIImage存储,改用本地文件URL(更适合大文件处理) - 调整上传方法:推荐用
putFile而非putData,避免大视频导致内存溢出 - 文件后缀:根据视频实际格式动态获取(比如.mp4、.mov),不用硬编码
改造后的代码
状态变量修改
@State var pickedVideos: [URL] = [] // 存储选中的本地视频文件URL @State var retrievedVideoPaths: [String] = [] // 存储上传后的Firebase路径,用于后续播放/访问
视频上传函数
func uploadVideo() { // 检查是否选中视频 guard let selectedVideoURL = pickedVideos.first else { print("未选择任何视频") return } // 创建Firebase Storage引用 let storageRef = Storage.storage().reference() // 生成唯一的视频文件路径,自动获取原视频的后缀名 let fileExtension = selectedVideoURL.pathExtension let videoPath = "videos/\(UUID().uuidString).\(fileExtension)" let fileRef = storageRef.child(videoPath) // 使用putFile上传视频(适合大文件,内存占用更低) let uploadTask = fileRef.putFile(from: selectedVideoURL, metadata: nil) { metadata, error in guard error == nil, metadata != nil else { print("视频上传失败:\(error?.localizedDescription ?? "未知错误")") return } // 将视频路径保存到Firestore let db = Firestore.firestore() db.collection("videos").document("user1").setData(["url": videoPath]) { error in if error == nil { DispatchQueue.main.async { self.retrievedVideoPaths.append(videoPath) print("视频上传成功,路径已保存至Firestore") } } else { print("保存视频路径失败:\(error!.localizedDescription)") } } } // 可选:监听上传进度 uploadTask.observe(.progress) { snapshot in let progressPercent = 100.0 * Double(snapshot.progress!.completedUnitCount) / Double(snapshot.progress!.totalUnitCount) print("当前上传进度:\(String(format: "%.1f", progressPercent))%") } }
关键说明
- 视频对应的类型:处理视频时不需要
UIImage,而是用URL指向本地视频文件,或者直接用Data(但大视频不推荐用Data,容易占满内存) - 文件格式选择:常见视频格式为.mp4、.mov,通过
selectedVideoURL.pathExtension可以自动获取选中视频的后缀,保证格式匹配 - 上传效率:
putFile方法直接从本地文件系统读取数据上传,比把视频转成Data再用putData更高效,也更稳定
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

