Как получить измененный размер downloadUrl после загрузки с помощью хранилища firebase (веб-SDK + расширение изображений для изменения размера)

С помощью Firebase Web SDK я могу легко получить downloadUrl после загрузки файла.

const task = firebase.ref().child('myFolder').put(file, metadata)
task.then(snapshot => {
 snapshot.ref.getDownloadURL()) 
}

Но я установил расширение Resize Images и теперь хочу получить измененный размер downloadUrl, как только он станет доступен. Как это сделать? Я не нахожу этому объяснений...

1 ответ

Решение

Расширение детерминированно определяет новое имя файла в зависимости от того, как вы его настроили. Вы можете увидеть точный код определения имени в исходном коде расширения.

Когда вы устанавливали расширение, оно запрашивало путь к изображениям с измененным размером относительно пути к оригиналу. Это путь к новому изображению (относительно оригинала, конечно).

Кроме того, в документации указано, что он будет иметь суффикс с настроенной шириной и высотой.

Называет изображение с измененным размером, используя то же имя, что и исходное загруженное изображение, но с суффиксом с указанными вами шириной и высотой.

Итак, если вы не указали путь, а указали 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));
Другие вопросы по тегам