跳至内容

Firebase 存储

Firebase 存储 是 Firebase 的云存储服务。它允许您存储和提供用户生成的内容,例如图像、音频、视频和其他文件。虽然大多数 API 可以像您通常使用 Firebase 一样使用,但 VueFire 公开了几个可组合函数,以便更好地与 Vue 集成,这些函数不仅让您访问响应式变量,还让您访问一些操作,例如 upload(),以便在保持响应式变量更新的同时更新文件。

安装

您不需要安装任何特定内容来使用 Firebase 存储与 VueFire。只需从 vuefire 中导入您需要的不同可组合函数,您就可以开始使用了。

您可以使用可组合函数 useFirebaseStorage() 从任何组件中访问 Firebase 存储。

上传文件

您可以使用 useStorageFile() 可组合函数上传文件并监控上传进度。这还公开了文件上传后的 URL 及其元数据,让我们从一个完整的表单上传示例开始

vue
<script setup lang="ts">
// See https://vueuse.org.cn/core/useFileDialog
import { useFileDialog } from '@vueuse/core'
import { ref as storageRef } from 'firebase/storage'
import { useFirebaseStorage, useStorageFile } from 'vuefire'

const storage = useFirebaseStorage()
const mountainFileRef = storageRef(storage, 'images/mountains.jpg')

const {
  url,
  // gives you a percentage between 0 and 1 of the upload progress
  uploadProgress,
  uploadError,
  // firebase upload task
  uploadTask,
  upload,
} = useStorageFile(mountainFileRef)

function uploadPicture() {
  const data = files.value?.item(0)
  if (data) {
    upload(data)
  }
}

const filename = ref<string>()
const { files, open, reset } = useFileDialog()
</script>

<template>
  <form @submit.prevent="uploadPicture">
    <!-- disable the form while uploading -->
    <fieldset :disabled="!!uploadTask">
      <button
        type="button"
        @click="open({ accept: 'image/*', multiple: false })"
      >
        <template v-if="files?.length === 1">
          Selected file: {{ files.item(0)!.name }} (Click to select another)
        </template>
        <template v-else> Select one picture </template>
      </button>

      <br />

      <button>Upload</button>
    </fieldset>
  </form>
</template>

上传图片后,您可以使用 url 响应式变量。例如,如果是图像,您可以显示它

模板
<img v-if="url" :src="url" />

下载文件

VueFire 还公开了一个较小的可组合函数,它只检索文件的 URL。如果您不需要上传文件,而只需要显示它,这很有用

vue
<script setup lang="ts">
import { useFileDialog } from '@vueuse/core'
import { ref as storageRef } from 'firebase/storage'
import { useFirebaseStorage, useStorageFile } from 'vuefire'

const storage = useFirebaseStorage()
const mountainFileRef = storageRef(storage, 'images/mountains.jpg')
const {
  url,
  // refresh the url if the file changes
  refresh,
} = useStorageFileUrl(mountainFileRef)
</script>

文件元数据

与访问文件 URL 的方式相同,您也可以访问文件元数据。您还可以使用 update() 函数更新元数据并保持响应式变量更新

vue
<script setup lang="ts">
import { useFileDialog } from '@vueuse/core'
import { ref as storageRef } from 'firebase/storage'
import { useFirebaseStorage, useStorageFile } from 'vuefire'

const storage = useFirebaseStorage()
const mountainFileRef = storageRef(storage, 'images/mountains.jpg')
const {
  metadata,
  // manually refresh the metadata
  refresh,
  // update metadata
  update,
} = useStorageFileMetadata(mountainFileRef)
</script>

请注意,元数据也可以在 useStorageFile() 可组合函数中访问。