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

Firebase Storage上传文件时无法添加元数据求助

问题:Firebase Storage上传后元数据为空的原因分析

按照Firebase官方文档开发多文件上传功能,代码如下,但上传完成后存储桶中对应文件的元数据字段为空,请问可能的原因是什么?

const metadata = {
  butts: "image/jpeg",
}

function Multi() {
  const [images, setImages] = useState()
  const [imageList, setImageList] = useState([])

  const uploadFiles = async () => {
    for (let i = 0; i < images.length; i++) {
      const name = `/image_storage/${v4()}`
      const imageRef = ref(proStorage, name)
      const uploadtask = uploadBytesResumable(imageRef, images[i], metadata)
      const imageListref = ref(proStorage, "image_storage/")

      uploadtask.then(
        "state_changed",
        (snapshot) => {
          const progress =
            (snapshot.bytesTransferred / snapshot.totalBytes) * 100
          console.log("Upload is " + progress + "% done")
          // eslint-disable-next-line
          switch (snapshot.state) {
            case "paused":
              console.log("Upload is paused")
              break
            case "running":
              console.log("Upload is running")
              break
          }
        },
        (error) => {},
        () => {
          getDownloadURL(uploadtask.snapshot.ref).then(async (downloadURL) => {
            console.log("File available at", downloadURL)
            listAll(imageListref).then((response) => {
              response.items.forEach((item) => {
                setImageList((prev) => [...prev, item.name])
              })
            })
          })
        }
      )
    }
  }

可能的原因:

  • 元数据字段不符合规范:你定义的metadata里用了自定义顶级字段butts,Firebase Storage只识别预定义的顶级元数据字段(比如contentType、cacheControl等),自定义元数据必须嵌套在customMetadata对象中。如果是要设置文件MIME类型,应该用contentType: "image/jpeg";如果是自定义字段,要写成customMetadata: { butts: "image/jpeg" },否则非标准顶级字段会被忽略。
  • 自定义元数据未正确嵌套:所有自定义的元数据键值对必须放在customMetadata属性下,Firebase才会将其保存到文件的元数据中。直接在顶级对象中添加自定义字段,Firebase不会处理这些字段,自然不会在存储桶中显示。
  • 上传状态监听方法错误:uploadBytesResumable返回的UploadTask需要用on()方法监听状态变化,而不是then()。你现在的写法完全不符合API要求,虽然这不会直接导致元数据为空,但属于代码逻辑错误,会导致进度监听、完成回调等逻辑失效,正确写法是uploadtask.on('state_changed', 进度回调函数, 错误回调函数, 完成回调函数)。

内容的提问来源于stack exchange,提问作者Brian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:11:27