readFile
асинхронный, вам нужно дождаться его завершения, прежде чем загружать его на S3.Но вместо использования readFile
вы можете предоставить читаемый поток до s3.upload
, который позволит вам загружать большие файлы без нехватки памяти и немного упростит код.
S3.upload({
Bucket: 'mirage-thumbnails',
Key: `${process.env.APP_ENV}/${idKey}/${modifiers}`,
Body: fs.createReadStream(imagePath),
ContentType: 'image/png',
ACL: 'public-read',
CacheControl: 'max-age=0',
}).promise();
В вашем коде bufferedData
не заполняется при вызове uploadToS3
.Вам следует подождать, пока файл не будет прочитан, а затем вызвать uploadToS3
.Код должен выглядеть следующим образом:
const fs = require('fs');
const promisify = require('util').promisify;
// Promisify readFile, to make code cleaner and easier.
const readFile = promisify(fs.readFile);
const uploadToS3 = async(idKey, modifiers, data) => {
return S3.upload({
Bucket: 'mirage-thumbnails',
Key: `${process.env.APP_ENV}/${idKey}/${modifiers}`,
Body: data,
ContentType: 'image/png',
ACL: 'public-read',
CacheControl: 'max-age=0',
}).promise();
};
const uploadImage = async(path) => {
const data = await readFile(imagePath);
// Wait until the file is read
return uploadToS3('key', 'modifier', data);
};
uploadImage('./some/path/image.png')
.then(() => console.log('uploaded!'))
.catch(err => console.error(err));
Используя потоки, просто измените uploadImage
на:
const uploadImage = async(path) => {
const stream = fs.createReadStream(path);
return uploadToS3('key', 'modifier', stream);
};