Я пытаюсь загрузить изображение в базу данных и затем создать 2 миниатюры. Я могу сделать это без проблем. Мой текущий дорожный блок - когда я записываю URL в базу данных реального времени, я всегда получаю тот же URL, что и при первоначальной загрузке.
Например:
- 1-я загрузка. Я получаю загруженное изображение с двумя соответствующими миниатюрами для изображения.
- 2-я загрузка. Я получаю загруженное изображение с двумя предыдущими миниатюрами (первое изображение)
- 3-я загрузка Я получаю загруженное изображение с первыми миниатюрами изображений ...
... это продолжает воспроизводить URL для первой загрузки
В моем хранилище генерируются правильные миниатюры, но URL всегда для первой загрузки?
Я не знаю, если это проблема с getSignedUrl () или нет, на самом деле не уверен, что здесь происходит.
Вот моя облачная функция:
export const generateThumbs = functions.storage
.object()
.onFinalize(async object => {
const bucket = gcs.bucket(object.bucket); // The Storage object.
// console.log(object);
console.log(object.name);
const filePath = object.name; // File path in the bucket.
const fileName = filePath.split('/').pop();
const bucketDir = dirname(filePath);
const workingDir = join(tmpdir(), 'thumbs');
const tmpFilePath = join(workingDir, 'source.png');
if (fileName.includes('thumb@') || !object.contentType.includes('image')) {
console.log('exiting function');
return false;
}
// 1. ensure thumbnail dir exists
await fs.ensureDir(workingDir);
// 2. Download Sounrce fileName
await bucket.file(filePath).download({
destination: tmpFilePath
});
//3. resize the images and define an array of upload promises
const sizes = [64, 256];
const uploadPromises = sizes.map(async size => {
const thumbName = `thumb@${size}_${fileName}`;
const thumbPath = join(workingDir, thumbName);
//Resize source image
await sharp(tmpFilePath)
.resize(size, size)
.toFile(thumbPath);
//upload to gcs
return bucket.upload(thumbPath, {
destination: join(bucketDir, thumbName),
metadata: {
contentType: 'image/jpeg'
}
}).then((data) => {
const file = data[0]
// console.log(data)
file.getSignedUrl({
action: 'read',
expires: '03-17-2100'
}).then((response) => {
const url = response[0];
if (size === 64) {
// console.log('generated 64');
return admin.database().ref('profileThumbs').child(fileName).set({ thumb: url });
} else {
// console.log('generated 128');
return admin.database().ref('categories').child(fileName).child('thumb').set(url);
}
})
.catch(function (error) {
console.error(err);
return;
});
})
});
//4. Run the upload operations
await Promise.all(uploadPromises);
//5. Cleanup remove the tmp/thumbs from the filesystem
return fs.remove(workingDir);
})