使用Firebase存储(Web SDK + 调整图像扩展程序)上传后如何获取调整大小的下载链接?

12

使用Firebase Web SDK,我可以轻松地在上传文件后获取下载链接(downloadUrl)

const task = firebase.ref().child('myFolder').put(file, metadata)
task.then(snapshot => {
 snapshot.ref.getDownloadURL()) 
}
但是我安装了 Resize Images Extention,现在我想在调整大小后立即获取下载链接。该怎么做?我找不到任何关于这方面的解释...
1个回答

13
该扩展会根据您的配置确定新文件名。您可以在扩展的source code中查看确切的代码以确定名称。
安装扩展时,它会要求您提供相对于原始路径的调整图像路径。这是新图像的路径(当然是相对于原始路径)。
除此之外,documentation 还说明它将被添加所配置的宽度和高度后缀。

使用与上传原始图像相同的名称命名调整大小的图像,但添加您指定的宽度和高度作为后缀。

因此,如果您未指定路径,并指定了200x200,则上传image.jpg到存储桶的根目录,新名称将为:image_200x200.jpg,位于存储桶的根目录下。
如果您指定了路径resized,并且指定了200x200,则在存储桶的根目录中上传image2.jpg,则新名称将为/resized/image2_200x200.jpg
要获取下载URL,您需要在扩展函数创建新文件后,在存储引用上调用getDownloadURL

如果您想等待,可以使用类似以下代码的轮询方式:

function delay(t, v) {
  return new Promise(function(resolve) { 
    setTimeout(resolve.bind(null, v), t)
  });
}

function keepTrying(triesRemaining, storageRef) {
  if (triesRemaining < 0) {
    return Promise.reject('out of tries');
  }

  return storageRef.getDownloadURL().then((url) => {
    return url;
  }).catch((error) => {
    switch (error.code) {
      case 'storage/object-not-found':
        return delay(2000).then(() => {
          return keepTrying(triesRemaining - 1, storageRef)
        });
      default:
        console.log(error);
        return Promise.reject(error);
    }
  })
}

这是上传后如何调用它的方法:

const storageRef = firebase.storage().ref().child('image_200x200.jpg');
keepTrying(10, storageRef).then((url) => console.log(url));

1
可能不是唯一的方法——例如,另一个云函数可以查找扩展程序创建的文件(例如通过触发目标路径),然后触发对RTDB或Firestore的更新,或发送云消息,或其他什么。我想这似乎是最直接的方法。 - robsiemb
最佳实践是将downloadUrl或引用存储在我的数据库中吗? - Damien Romito
1
对我来说,存储路径名或 gs:// URL 比存储下载 URL 更自然,因为这样更灵活,可以进行其他操作。 - robsiemb
太棒了,谢谢。不确定你的延迟函数在做什么,但我用这个替换了它:delay(t) { return new Promise(resolve => { setTimeout(resolve, t); }); } 另外,如果你正在使用AngularFire,它会返回一个observable,所以你必须将其转换为promise ".getDownloadURL().toPromise().then"。 - MadMac
另一种方法是在存储上放置一个Firebase触发器,然后当文件被创建时将其写入Firestore集合。您可以监视此集合以查看新文件何时出现,然后检查预期的文件名。虽然比这个解决方案要多做很多工作。 - MadMac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接