Загрузить из источника и загрузить в gcloud с помощью облачной функции - PullRequest
0 голосов
/ 27 марта 2020

Я использую сервис opentok, который хранит видео в своем облаке и дает мне URL-адрес обратного вызова, когда файл готов, чтобы я мог загрузить его и сохранить в своем облачном провайдере.

Мы используем gcloud где мы работаем, и мне нужно скачать файл, а затем сохранить его в моем gcloud-хранилище с облачными функциями firebase.

Вот мой код:

    const archiveFile = await axios.get(
      'https://sample-videos.com/video701/mp4/720/big_buck_bunny_720p_2mb.mp4'
    );
    console.log('file downloaded from opentokCloud !');

    fs.writeFile('archive.mp4', archiveFile, err => {
      if (err) throw err;
      // success case, the file was saved
      console.log('File Saved in container');
    });

    await firebaseBucket.upload('archive.mp4', {
      gzip: true,
      // destination: `archivedStreams/${archiveInfo.id}/archive.mp4`,
      destination: 'test/lapin.mp4',
      metadata: {
        cacheControl: 'no-cache',
      },
    });

Я пытался поместить файл непосредственно скачанный в upload(), но он не работает, я должен предоставить строку (путь к моему файлу). Как мне получить путь к моему загруженному файлу в облачной функции? Это все еще в ОЗУ моего контейнера или в папке кэша?

Как вы можете видеть, я пытался писать с помощью FS, но у меня нет доступа на запись в контейнер функции облака

Заранее спасибо сообществу

1 Ответ

0 голосов
/ 30 марта 2020

Если кто-то ищет это в будущем, вот как я это решил:

С помощью облачных функций Firebase вы можете записывать временные файлы в /tmp (дополнительную информацию см. Здесь https://cloud.google.com/functions/docs/concepts/exec#file_system )

Я решил проблему с помощью пакета node-fetch и writeStream функции Node.JS:

const fetch = require('node-fetch');
const fs = require('fs');

await fetch(archiveInfo.url).then(res => {
  console.log('start writing data');
  const dest = fs.createWriteStream('/tmp/archive.mp4');
  res.body.pipe(dest);

  //Listen when the writing of the file is done
  dest.on('finish', async () => {
    console.log('start uploading in gcloud !');
    await firebaseBucket.upload('/tmp/archive.mp4', {
      gzip: true,
      destination: `{pathToFileInBucket}/archive.mp4`,
      metadata: {
        cacheControl: 'no-cache',
      },
    });
    console.log('uploading finished');
  });
});

firebaseBucket - это мое ведро gcloud, уже настроенное в другом месте, определите ваше собственная корзина, использующая @google-cloud/storage

Поскольку моя функция вызывается по ссылке, не забудьте добавить ответ и отловить ошибки, чтобы избежать тайм-аутов облачных функций (работающих ни за что, ни за что не выставляемых счет: D)

...