如何在Unity中通过REST API上传文件至Firebase Storage
Unity 借助 REST API 实现 Firebase Storage 文件上传
一、Firebase 前期准备
- 登录 Firebase 控制台,创建/打开项目并启用 Cloud Storage 服务
- 设置 Storage 安全规则(测试阶段可临时放宽,上线后严格限制):
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if true; // 仅测试用,上线替换为身份验证逻辑 } } } - 获取核心配置信息:
- 项目 API Key:控制台 → 项目设置 → 通用 → Web API Key
- Storage Bucket 地址:控制台 → Storage → 文件 → 右上角设置,格式为
gs://[你的存储桶名].appspot.com,REST 请求时需转为https://firebasestorage.googleapis.com/v0/b/[你的存储桶名].appspot.com/o
二、Unity 实现本地文件选择
Unity 无原生跨平台文件选择器,分场景实现:
编辑器/Windows 打包版本
使用内置面板或 WinForm 对话框:
using UnityEngine; using UnityEngine.UI; #if UNITY_EDITOR using UnityEditor; #elif UNITY_STANDALONE_WIN using System.Windows.Forms; #endif public class FileUploader : MonoBehaviour { public Button browseBtn; private string selectedFilePath; void Start() { browseBtn.onClick.AddListener(OpenFileBrowser); } void OpenFileBrowser() { #if UNITY_EDITOR selectedFilePath = EditorUtility.OpenFilePanel("选择上传文件", "", ""); #elif UNITY_STANDALONE_WIN var openDialog = new OpenFileDialog(); if (openDialog.ShowDialog() == DialogResult.OK) { selectedFilePath = openDialog.FileName; } #endif if (!string.IsNullOrEmpty(selectedFilePath)) { Debug.Log("已选文件:" + selectedFilePath); UploadToFirebase(selectedFilePath); } } }
注意:Windows 打包需在 Player Settings 中勾选 Allow 'unsafe' code,并在 Visual Studio 中添加
System.Windows.Forms引用。
移动端(Android/iOS)
可使用 UnityEngine.Windows.FilePicker(部分版本支持)或第三方插件(如 Native File Picker),核心是获取文件绝对路径或字节流,同时需在权限配置中添加文件读取权限(Android 的 READ_EXTERNAL_STORAGE、iOS 的 NSPhotoLibraryUsageDescription)。
三、REST API 文件上传实现
这里以简单上传(适合 10MB 以内文件)为例,大文件推荐使用可恢复上传。
1. 核心上传代码
using System.IO; using System.Threading.Tasks; using UnityEngine.Networking; async void UploadToFirebase(string filePath) { // 读取文件字节 var fileBytes = File.ReadAllBytes(filePath); var fileName = Path.GetFileName(filePath); // 自定义存储路径(如"user_uploads/" + fileName) var storagePath = Uri.EscapeDataString($"user_uploads/{fileName}"); var apiKey = "你的 Firebase API Key"; var bucketUrl = "https://firebasestorage.googleapis.com/v0/b/[你的存储桶名].appspot.com/o"; // 构造请求 var request = new UnityWebRequest($"{bucketUrl}?name={storagePath}&uploadType=media", "POST"); request.SetRequestHeader("Content-Type", GetMimeType(filePath)); request.SetRequestHeader("X-Goog-Upload-Protocol", "raw"); request.uploadHandler = new UploadHandlerRaw(fileBytes); request.downloadHandler = new DownloadHandlerBuffer(); // 发送请求并等待完成 var operation = request.SendWebRequest(); while (!operation.isDone) { // 可通过 request.uploadProgress 实现进度条 await Task.Yield(); } // 处理响应 if (request.result == UnityWebRequest.Result.Success) { Debug.Log("上传成功!响应:" + request.downloadHandler.text); // 生成文件下载 URL var downloadUrl = $"{bucketUrl}/{storagePath}?alt=media"; Debug.Log("文件下载地址:" + downloadUrl); } else { Debug.LogError("上传失败:" + request.error); } request.Dispose(); } // 获取文件 MIME 类型 string GetMimeType(string filePath) { var extension = Path.GetExtension(filePath).ToLowerInvariant(); return extension switch { ".jpg" or ".jpeg" => "image/jpeg", ".png" => "image/png", ".txt" => "text/plain", ".pdf" => "application/pdf", _ => "application/octet-stream" }; }
2. 大文件可恢复上传
若文件超过 10MB,需使用可恢复上传流程:
- 第一步:发送 POST 请求获取上传会话 URL
- 第二步:通过会话 URL 分块上传文件
- 核心逻辑是处理分块续传、断点恢复,可参考 Firebase REST 文档的可恢复上传规范实现。
四、关键注意事项
- 安全规则:上线前必须修改 Storage 规则,添加身份验证逻辑(如仅允许已登录用户上传),防止匿名滥用
- 错误处理:补充网络异常、文件不存在、权限不足等场景的捕获逻辑
- 性能优化:大文件分块上传时,控制单块大小(推荐 256KB - 10MB),避免内存溢出
内容的提问来源于stack exchange,提问作者Savad
相关产品推荐
相关产品推荐

