0

I need to save file in S3 Digital Ocean space by URL. It can't be downloaded and then saved to S3, because we use firebase-functions, and there restricted to use file system. Is there way to save it directly from url or other ways? For example by stream?

const fileName = 'image.jpg';
const url = 'imageUrl';

const res = await https.get(url, (stream) => stream.pipe(res));

  await s3
    .upload({
      Bucket: 'name',
      Key: `content/${fileName}`,
      Body: res,
      ACL: 'public-read'
    })
    .promise();
evilcore29
  • 54
  • 4

1 Answers1

0

All problem were in wrong path to /tmp directory. Docs. Final code for Firebase functions:

const fs = require('fs');
const s3 = require('../../services/storage');
const download = require('download');

const saveMediaItemToStorage = async (sourceId, item) => {
  // * creating file name
  const fileName = `${item.id}.${item.extension}`;

  // * saving file to /tmp folder
  await download(item.originalMediaUrl, '/tmp', { filename: fileName });

  const blob = fs.readFileSync(`/tmp/${fileName}`);

  // * saving file to s3
  await s3
    .upload({
      Bucket: 'name',
      Key: `content/${sourceId}/${fileName}`,
      Body: blob,
      ACL: 'public-read'
    })
    .promise();

  // * remove file from temp folder
  fs.unlink(`/tmp/${fileName}`, function (err) {
    if (err) return console.log(err);
    console.log('file deleted successfully');
  });
};

module.exports = saveMediaItemToStorage;
evilcore29
  • 54
  • 4