Миниатюра, созданная из первого изображения, дублируется для других в хранилище Firebase - PullRequest
0 голосов
/ 31 декабря 2018

После того, как я загрузил изображение.Облачная функция генерирует свои миниатюры, как указано в соответствующей функции Firebase, используя sharp на машинописи.Но для второго изображения и т. Д. Миниатюры генерируются и называются правильно, как и ожидалось, но они содержат такой же большой палец, как и первое загруженное изображение.

Первое фото: Первое

Миниатюра первой фотографии: большой палец первой

Вторая фотография: по умолчанию

Миниатюра второй фотографии: большой палец по умолчанию

import * as functions from 'firebase-functions';

import * as Storage from '@google-cloud/storage';
const gcs = Storage();

import { tmpdir } from 'os';
import { join, dirname } from 'path';

import * as sharp from 'sharp';
import * as fs from 'fs-extra';

export const generateThumbs = functions.storage.object().onFinalize(async object => {
    const bucket = gcs.bucket(object.bucket);
    const filePath = object.name;
    const fileName = filePath.split('/').pop();
    console.log('filename : ' + fileName);
    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 Source File
    await bucket.file(filePath).download({
        destination: tmpFilePath
    });

    // 3. Resize the images and define an array of upload promises
    const sizes = [64, 256, 512];

    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)
        });
    });

    // 4. Run the upload operations
    await Promise.all(uploadPromises);

    // 5. Cleanup remove the tmp/thumbs from the filesystem
    return fs.remove(workingDir);
});

Ожидается: уникальные загруженные файлы должны приводить к уникальным превью, а не просто к уникальным именам.

Факт: только новые имена файлов генерируются со старыми данными большого пальца из предыдущего изображения.

1 Ответ

0 голосов
/ 06 августа 2019

Я думаю, что это проблема кеширования. Я добавил обходной путь, используя uuid в папке tmp.Поэтому невозможно, чтобы больше были кэшированные файлы.

Установите пакет uuid

npm i uuid

, импортируйте его как глобальный

import { Storage } from '@google-cloud/storage';
const gcs = new Storage();
const uuidv1 = require('uuid/v1');

и измените строку workinDir на:

const workingDir = join(tmpdir() + '/' + uuidv1(), 'thumbs');
...