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
相关产品推荐
相关产品推荐

