reactjs - 尝试将自定义元数据添加到 Firebase 存储和 Firestore
问题描述
我一直在尝试拼凑一个应用程序,该应用程序存储图像、图像标题和要在主页上显示的简短描述,并在单击图像时出现一个模式,其中包含图片的放大副本和名称/描述向右。我能够成功地将图像上传到 Firebase 存储,但我很难考虑如何添加自定义元数据,如果有人有任何见解,将不胜感激。
到目前为止,我将其作为我的 firebase 存储挂钩:
import { projectStorage, projectFirestore, timestamp } from '../firebase/config';
const useStorage = (file, pieceName, pieceDescription) => {
const [progress, setProgress] = useState(0);
const [error, setError] = useState(null);
const [url, setUrl] = useState(null);
useEffect(() => {
// references
const storageRef = projectStorage.ref(file.name);
const collectionRef = projectFirestore.collection('images');
const newMetadata = {
Name: pieceName,
contentDescription: pieceDescription
}
storageRef.put(file, newMetadata).on('state_changed', (snap) => {
let percentage = (snap.bytesTransferred / snap.totalBytes) * 100;
setProgress(percentage);
}, (err) => {
setError(err);
}, async () => {
const url = await storageRef.getDownloadURL();
const createdAt = timestamp();
collectionRef.add({ url, createdAt });
setUrl(url);
});
}, [file, pieceName, pieceDescription]);
return { progress, url, error };
我的上传组件如下所示:
import React, { useState } from 'react';
import ProgressBar from './progressBar';
const UploadForm = () => {
const [file, setFile] = useState(null);
const [pieceName, setPieceName] = useState(null);
const [pieceDescription, setPieceDescription] = useState(null);
const [error, setError] = useState(null);
const types = ['image/png', 'image/jpeg']
const changeHandler = (e) => {
let selected = e.target.files[0];
if (selected && types.includes(selected.type)) {
setFile(selected);
setPieceName(pieceName);
setPieceDescription(pieceDescription);
setError('');
} else {
setFile(null);
setError('Please select an image file (png or jpeg)');
}
}
return (
<form>
<form id="form" class="topBefore" name="upload">
<input id="pieceName" type="text" placeholder="PIECE NAME"/>
<textarea id="pieceDescription" name="message" type="text" placeholder="ABOUT PIECE"></textarea>
<label id="upLoadButton">
<input type="file" onChange={changeHandler}/>
<span id="spanTest">UPLOAD</span>
</label>
</form>
<div className="output">
{ error && <div className="error">{error}</div> }
{ file && <div> { file.name} </div>}
{ file && <ProgressBar file={file} setFile={setFile} />}
</div>
</form>
)
}
export default UploadForm;
任何能让我朝着正确方向前进的技巧都会很棒。
解决方案
推荐阅读
- c++ - 'mutex' 未在此范围内声明。使用 MinGW 编译器处理 VS 代码
- r - 用逗号分隔的字符串总数
- swift - swift中的减号(无法读取数据)
- python - 如何使用 python 在 MS Word 中创建/修改动态目录
- javascript - gulp version.match -> 无法读取属性“匹配”
- java - 如何使用多线程来创建 gremlin 边缘
- aframe - A-frame 'look-at' 组件可以查看默认相机吗?
- r - Julia 循环和 R 循环一样慢
- asp.net - 将多个数据集传递给视图 [MVC]
- java - 在 C# 中使用 SHA1 算法将 ComputeHash 转换为 Java