如何从FileManager上传视频到Firebase Storage?URL转Data遇阻
解决Firebase Storage上传本地视频文件的问题
你遇到的核心问题是putData(_:metadata:completion:)方法要求传入Data类型参数,但你传入的是本地文件的URL。这里有两种可行的解决方式:
推荐方案:使用putFile直接上传文件
Firebase Storage提供了putFile(from:metadata:completion:)方法,专门用于上传本地文件URL,无需先将文件转为Data,这种方式更高效(尤其是视频这类大文件,避免加载整个文件到内存)。
修改后的代码如下:
private func persistVideoToStorage(id: String, video: URL) { let ref = FirebaseManager.shared.storage.reference(withPath: id) // 使用putFile直接上传本地文件URL ref.putFile(from: video, metadata: nil) { metadata, err in if let err = err { print(err) return } ref.downloadURL { url, err in if let err = err { print(err) return } guard let downloadUrl = url else { return } // 这里可以处理获取到的下载URL,比如保存到数据库 print("视频上传完成,下载URL:\(downloadUrl)") } } }
备选方案:将URL转为Data上传
如果一定要用putData,可以通过Data(contentsOf:)从URL读取文件内容,但不推荐用于大文件(会占用大量内存),代码示例如下:
private func persistVideoToStorage(id: String, video: URL) { let ref = FirebaseManager.shared.storage.reference(withPath: id) // 从URL读取Data,注意处理错误 do { let videoData = try Data(contentsOf: video) ref.putData(videoData, metadata: nil) { metadata, err in if let err = err { print(err) return } ref.downloadURL { url, err in if let err = err { print(err) return } guard let downloadUrl = url else { return } print("视频上传完成,下载URL:\(downloadUrl)") } } } catch { print("读取视频文件失败:\(error)") } }
注意事项
- 确保你的App有访问该文件路径的权限,对于FileManager的Documents目录,默认是有权限的,但如果是其他目录需要额外配置权限。
- 大文件上传优先用
putFile,避免内存溢出问题。
内容的提问来源于stack exchange,提问作者AdamLeet
相关产品推荐
相关产品推荐

