Триггеры хранения в облачной функции Firebase в порядке, первые URL-адреса миниатюр в порядке, затем следующие - все те же URL-адреса миниатюр, что и первые - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь загрузить изображение в базу данных и затем создать 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);
  })

1 Ответ

0 голосов
/ 15 апреля 2019

Очистил мой код и решил мою проблему. Вот как я сгенерировал URL-адреса и передал их по соответствующим URL-адресам, используя UID пользователя и postId в пути к файлу:

export const generateThumbs = functions.storage
.object()
.onFinalize(async object => {
    const fileBucket = object.bucket; // The Storage bucket that contains the file.
    const filePath = object.name; // File path in the bucket.
    const fileName = filePath.split('/').pop();
    const userUid = filePath.split('/')[2];
    const sizes = [64, 256];
    const bucketDir = dirname(filePath);

    console.log(userUid);

    if (fileName.includes('thumb@') || !object.contentType.includes('image')) {
        console.log('exiting function');
        return false;
      }

    const bucket = gcs.bucket(fileBucket);
    const tempFilePath = path.join(tmpdir(), fileName);

    return bucket.file(filePath).download({
      destination: tempFilePath
    }).then(() => {

     sizes.map(size => {      
        const newFileName = `thumb@${size}_${fileName}.png`
        const newFileTemp = path.join(tmpdir(), newFileName);
        const newFilePath = `thumbs/${newFileName}`

        return sharp(tempFilePath)
          .resize(size, size)
          .toFile(newFileTemp, () => {

            return bucket.upload(newFileTemp, {
                destination: join(bucketDir, newFilePath),
                metadata: {
                    contentType: 'image/jpeg'
                  }
            }).then((data) => {
                const file = data[0]
                console.log(data)
                file.getSignedUrl({
                  action: 'read',
                  expires: '03-17-2100'
                }, function(err, url) {
                    console.log(url);
                  if (err) {
                    console.error(err);
                    return;
                  }
                  if (size === 64) {
                    return admin.database().ref('profileThumbs').child(userUid).child(fileName).set({ thumb: url });
                  } else {
                    return admin.database().ref('categories').child(fileName).child('thumb').set(url);
                  }
                })
              })
          })
      })
    }).catch(error =>{
        console.log(error);
      });
  })
...