下载 Cloud Storage 文件 (Unity)

Cloud Storage 可让开发者从 Firebase 提供和管理的 Google Cloud Storage 存储分区快速轻松地下载文件。

创建引用

要下载某个文件,请首先为要下载的文件创建一个 Cloud Storage 引用

您可以通过将子路径附加到存储根目录来创建引用,也可以根据指向 Cloud Storage 中的对象的现有 gs://https:// 网址创建引用。

// Create a reference with an initial file path and name
Firebase.Storage.StorageReference path_reference =
  storage.GetReference("images/stars.jpg");

// Create a reference from a Google Cloud Storage URI
Firebase.Storage.StorageReference gs_reference =
  storage.GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
Firebase.Storage.StorageReference https_reference =
  storage.GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

下载文件

存储在 Cloud Storage 中的文件可以通过四种方式检索:

  1. 通过网址下载
  2. 下载到字节数组
  3. 使用流下载
  4. 下载至本地文件

您将用于检索文件的方法取决于您将如何在游戏中使用数据。

通过网址下载

如果您希望将一个网址与 Unity 的 WWWUnityWebRequest 配合使用,可以通过调用 GetDownloadUrlAsync() 来获取文件的下载网址。

// Fetch the download URL
reference.GetDownloadUrlAsync().ContinueWith((Task<Uri> task) => {
  if (!task.IsFaulted && !task.IsCanceled) {
    Debug.Log("Download URL: " + task.Result());
    // ... now download the file via WWW or UnityWebRequest.
  }
});

下载到字节数组

您可以使用 GetBytesAsync() 方法将文件下载到内存中的字节缓冲区。这种方法会将文件的全部内容加载到内存中。如果您请求下载的文件大于应用的可用内存,您的应用将崩溃。要防止出现内存问题,请确保将最大大小设置为已知您的应用可以处理的数值,或使用另一种下载方法。

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const long maxAllowedSize = 1 * 1024 * 1024;
reference.GetBytesAsync(maxAllowedSize).ContinueWith((Task<byte[]> task) => {
  if (task.IsFaulted || task.IsCanceled) {
    Debug.Log(task.Exception.ToString());
    // Uh-oh, an error occurred!
  } else {
    byte[] fileContents = task.Result;
    Debug.Log("Finished downloading!");
  }
});

通过流下载

使用流下载文件可以让您在加载数据的过程中即对其进行处理,从而最大限度提高您在处理下载时的灵活性。调用 GetStreamAsync() 并传递您自己的流处理器作为第一个参数。此代理将被一个流在后台线程中调用,因而您可以执行容易出现延迟的操作或计算,例如将内容存储至磁盘。

// Download via a Stream
reference.GetStreamAsync( stream => {
    // Do something with the stream here.
    //
    // This code runs on a background thread which reduces the impact
    // to your framerate.
    //
    // If you want to do something on the main thread, you can do that in the
    // progress eventhandler (second argument) or ContinueWith to execute it
    // at task completion.
}, null, CancellationToken.None);

GetStreamAsync() 在流处理器之后获取一个可选参数,允许您取消操作或接收进度通知。

下载至本地文件

GetFileAsync() 方法可将文件直接下载至本地设备。如果您的用户希望在离线时也可以访问该文件,或者希望在其他应用中共享该文件,则可使用此方法。

// Create local filesystem URL
string local_url = "file:///local/images/island.jpg";

// Download to the local filesystem
reference.GetFileAsync(local_url).ContinueWith(task => {
    if (!task.IsFaulted && !task.IsCanceled) {
        Debug.Log("File downloaded.");
    }
});

您可以将侦听器附加到下载中,以便监控下载的进度。侦听器采用标准 System.IProgress<T> 接口。您可以使用 StorageProgress 类的一个实例,提供自己的 Action<T> 作为进度完成的回调。

// Create local filesystem URL
string local_url = "file:///local/images/island.jpg";

// Start downloading a file
Task task = reference.GetFileAsync(local_file,
  new Firebase.Storage.StorageProgress <DownloadState>((DownloadState state) => {
    // called periodically during the download
    Debug.Log(String.Format(
      "Progress: {0} of {1} bytes transferred.",
      state.BytesTransferred,
      state.TotalByteCount
    ));
  }), CancellationToken.None);

task.ContinueWith(resultTask => {
  if (!resultTask.IsFaulted && !resultTask.IsCanceled) {
    Debug.Log("Download finished.");
  }
});

处理错误

导致下载出错的原因有很多,包括文件不存在或用户无权访问所需文件。如需了解有关错误的详细信息,请参阅文档的处理错误部分。

后续步骤

对于存储在 Cloud Storage 中的文件,您还可以获取和更新元数据

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面