首页 > 解决方案 > Firebase 存储验证图像是否存在并使用新名称上传

问题描述

 uploadVariationImages(file, cb) {

    // nome do arquivo
    const fileName = file.name;
    // caminho para o storage
    const path = `abc/${fileName}`;
    let ref = this.afStorage.ref(path);
    console.log("First metadata: ", ref.getMetadata());
    ref.getMetadata().toPromise()
    .then( res => {
        let currentFileName = fileName.split(".")[0];
        let i = 1;
        let flag = true;
        do {
          let attempt = this.checkIfImageExists(i, currentFileName, file);
          attempt.toPromise()
          .then( (res) => {
            console.log(res);
            i++;
            console.log(i);
          })
          .catch( (err) => {
            console.log(err);
            console.log(i);
            flag = false;
            console.log(i);
          })
        } while (flag === true)
      })
      .catch((error) => { // erro significa que nao achou metadata, ou seja, a imagem não existe.
        this.task = this.afStorage.upload(path, file);
        this.snapshot = this.task.snapshotChanges();
        console.log("1º: ", error);
        cb(error, null);
      });

  }

checkIfImageExists(file, cb) {

    // nome do arquivo
    const fileName = file.name;
    // caminho para o storage
    const path = `abc/${fileName}`;
    let ref = this.afStorage.ref(path);
    console.log("First metadata: ", ref.getMetadata());
    ref.getMetadata().toPromise()

  }

使用此代码,我得到了一个永远的循环,因为它永远不会进入错误(当它没有找到任何图像并且它意味着在破折号 {-} 之后使用新数字上传图像时)。我想要做的是上传一张图片,但它必须首先验证它的名称,如果它已经存在,那么它必须在它之后插入一个 -1 或者如果那个已经存在然后插入和 -2 等等。目前,当它进入第二个错误时,我没有上传任何内容,因此如果发生某些事情,我不会上传太多图像,但如果它可以工作,我将不得不在其中插入代码来执行此操作。

标签: javascriptfirebasefirebase-storage

解决方案


while (flag == true)没有等待任何承诺解决,所以这将进入一个紧密的循环。

在这种情况下,递归通常是您的朋友:

function findFirstNonExistingFile(startAt, callback) {
  checkIfImageExits(startAt).then(() => {
    findFirstNonExistingFile(startAt+1, callback);
  }).catch(() => {
    callback(startAt);
  })
}

由于所有调用都在 promise 结果(thencatch)内,因此它们总是在检查当前文件时处理。

您可以将其与以下内容一起使用:

findFirstNonExistingFile(1, (i) => {
  console.log(i);
});

当然,你也可以用一个 Promise 来实现它,但流程是一样的。


推荐阅读