【问题标题】:How to save unique id as a name of a image in Firebase?如何在 Firebase 中将唯一 ID 保存为图像的名称?
【发布时间】:2020-08-12 19:46:27
【问题描述】:

嘿,伙计们,我遇到了与 firebase 相关的问题,所以问题是每当我两次上传同一张照片时,我都会收到一个错误,即之前的照片由于名称相同而无法获取(这是一个空白的 img 图标),所以我安装了生成唯一 ID 的库“uuidv4”,那么我如何放置和保存唯一 ID 而不是给定的图像名称

let uniqueId = uuidv4()
const uploadTask = storage.ref(`images/${image.name}`).put(image);

然后我就这样做了

let uniqueId = uuidv4()
const uploadTask = storage.ref(`images/${uniqueId}`).put(image);

但出现错误 "Firebase Storage: Invalid argument in put at index 0: Expected Blob or File.

上传功能(我下面有jsx,我没有在底部包含,所以不用担心右括号)

function ImageUpload({username}) {
    const [image, setImage] = useState(null);
    const [progress, setProgress] = useState(0);
    const [caption, setCaption] = useState('');

    const handleChange = (e) => {
        if (e.target.files[0]) {
            setImage(e.target.files[0]);
        }
    };

    const handleUpload = () => {
        let uniqueId = uuidv4()
        const uploadTask = storage.ref(`images/${image.name}`).put(image);

        uploadTask.on(
            "state_changed",
            (snapshot) => {
                const progress = Math.round (
                    (snapshot.bytesTransferred / snapshot.totalBytes) * 100
                );
                setProgress(progress);
            },
            (error) => {
                console.log(error);
                alert(error.message);
            },
            () => {
                storage
                .ref("images")
                .child(image.name)
                .getDownloadURL()
                .then(url => {
                    db.collection("posts").add({
                        timestamp: firebase.firestore.FieldValue.serverTimestamp(),
                        caption: caption,
                        imageUrl: url,
                        username: username                     
                    })
                })
                setProgress(0)
                setCaption('')
                setImage(null)
            }
        )
    }
return(jsx)
}

【问题讨论】:

  • 如果您查看它需要文件或 blob 的错误。您需要向我们展示“上传代码”以及您如何上传到存储以及该输入文件
  • @CyrusZei 当我输入 id 时,它适用于第一张图片,但是当我选择上传相同的图片时,它会给我错误,或者如果我选择另一个图片,它可以完美地工作
  • @CyrusZei我已经添加了代码,你可以再检查一下

标签: javascript reactjs firebase firebase-storage


【解决方案1】:

在 firebase 中,您可以自行决定上传文件的名称。但是,如果图像链接到帐户,我通常会使用登录用户的 mAuth id 作为目录或只是文件名。这样可以避免重复!

另一种方法是使用根据日期或时间生成唯一密钥的算法,但您仍然需要仔细检查该密钥是否已经存在才能确定。

可能还有另一种我不知道的方式,因为在实时数据库上创建会以某种方式创建自己的密钥。

同一张照片你可以简单地再次递归调用该方法并在文件末尾添加索引,但是这种方法不是很好用。

有关更多或更好的详细信息,请查看此帖子: Does Firebase storage offer unique Id's for files?

【讨论】:

  • 但是你能告诉我如何实现唯一 id (uuid) 而不是实际的image.name
  • 好吧,我实际上不知道如何实现,我通常使用在线的东西 xD 但是,如果您应该将图像链接到用户,您可以只使用他的 mAuth.uid 作为唯一键/文件夹. storage.ref(images/${mAuth.uid}),在这种情况下,mAuth用于用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多