【问题标题】:Upload multiple images to firebase then save image url to firestore将多张图片上传到 firebase,然后将图片 url 保存到 firestore
【发布时间】:2021-01-17 14:28:30
【问题描述】:

有人可以帮助我修改代码,以便等待上传完成然后将图片网址保存到 Firestore 吗?我是异步和等待的新手,似乎无法弄清楚。即使我在Promise.all(promises).then() 内保存到firestore,fileDownloadUrl 仍然是空的:

cxonst promises = [];
const fileDownloadUrl = [];

pictures.forEach(file => {
    const uploadTask = 
    firebase
    .storage()
    .ref()
    .child(`img/upl/${file.data.name}`)
    .put(file.uploadTask);
    
    promises.push(uploadTask);

    uploadTask.on(
        
        firebase.storage.TaskEvent.STATE_CHANGED,
        snapshot => {
            const progress = Math.round((snapshot.bytesTransferred / 
                 snapshot.totalBytes) * 100);
            
            if (snapshot.state === firebase.storage.TaskState.RUNNING) {
                console.log(`Progress: ${progress}%`);
            }
        },
        error => console.log(error.code),
        async () => {
            const downloadURL = await 
            uploadTask.snapshot.ref.getDownloadURL();
            fileDownloadUrl.push(downloadURL);
            }
        );
    });

    Promise.all(promises)
    .then(() => {
        db
        .collection("properties")
        .add({
            timestamp: firebase.firestore.FieldValue.serverTimestamp(),
            title: title,
            description: description,
            pictures: fileDownloadUrl,
            user: user.uid
        })
    })
    .catch(err => console.log(err));

【问题讨论】:

    标签: reactjs firebase google-cloud-firestore firebase-storage


    【解决方案1】:

    当您等待put 调用的承诺完成时,您将使用uploadTask.on() 来确定下载 URL。由于这个on 不是承诺的一部分,因此不能保证它们是同步的。

    一个更简单且有效的方法应该是:

    const promises = pictures.map(file => {
      const ref = firebase.storage().ref().child(`img/upl/${file.data.name}`);
      return ref
        .put(file.uploadTask)
        .then(() => ref.getDownloadURL())
    });
    
    Promise.all(promises)
    .then((fileDownloadUrls) => {
        db
        .collection("properties")
        .add({
            timestamp: firebase.firestore.FieldValue.serverTimestamp(),
            title: title,
            description: description,
            pictures: fileDownloadUrls,
            user: user.uid
        })
    })
    .catch(err => console.log(err));
    

    【讨论】:

    • 太棒了!这段代码很干净并且有效!现在,我只需要了解它是如何工作的以及在哪里获得进度事件
    • 如果需要,您仍然可以使用相同的on 来衡量进度。
    猜你喜欢
    • 2018-02-26
    • 2020-12-05
    • 2020-06-24
    • 2020-04-14
    • 1970-01-01
    • 2020-09-13
    • 2016-12-24
    相关资源
    最近更新 更多