Как получить измененный размер 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));