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

如何使用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)
                        }
                    }
                    
                }
                
            }
        }
    }

视频上传改造方案

核心修改点

  1. 替换数据类型:视频不需要用UIImage存储,改用本地文件URL(更适合大文件处理)
  2. 调整上传方法:推荐用putFile而非putData,避免大视频导致内存溢出
  3. 文件后缀:根据视频实际格式动态获取(比如.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:35:21