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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:10:28