Хорошо, есть несколько вещей, которые вы должны сделать, чтобы сделать эту работу. 1. вам нужно настроить локальный экземпляр multer, так как вам нужно загрузить файл локально перед переходом на s3. Я пытался сделать это с помощью s3 напрямую, но он, похоже, использовал много дорогостоящих и трудоемких операций чтения, которые занимали гораздо больше времени, чем первая запись файла на сервер. Я считаю, что это лучшее решение.
Вы делаете это так:
const localStorage = multer.diskStorage({
destination: function(req, file, cb) {
const destination = __dirname + "\\canvas-uploads";
console.log("destination", destination);
cb(null, destination);
},
filename: function(req, file, cb) {
const filename = req.body.id + "." + file.mimetype.toString().slice(file.mimetype.toString().lastIndexOf("/") + 1);
console.log("filename", filename);
cb(null, filename);
}
});
const uploadLocal = multer({
storage: localStorage
});
Вам необходимо настроить ffmpeg-fluent и обернуть его в обещание, чтобы вы могли быть уверены, что он завершен со всей вашей обработкой (загрузка в s3 и et c по тому же маршруту.) Для удобства.
вы делаете это так:
router.post('/upload-temp', uploadLocal.array("upload"), async(req, res, next) =>{
res.json({id: req.body.id});
});
router.post('/ffmpeg', async(req, res, next) => {
try {
const reqPath = path.join(__dirname, '../upload/canvas-uploads/');
const {id, type} = req.body;
const localFileInput = `${reqPath}${id}.webm`;
const localFileOutput = `${reqPath}${id}.${type}`;
console.log("localInput", localFileInput);
console.log("localOutput", localFileOutput);
const key = `canvas/${id}.${type}`;
await new Promise((resolve, reject) => {
ffmpeg().input(localFileInput)
.withOutputFormat(type)
.output(localFileOutput)
.on('end',async ()=> {
const fileContent = await fs.readFileSync(localFileOutput);
await fs.unlinkSync(localFileInput);
await fs.unlinkSync(localFileOutput);
const params = {
Bucket: process.env.BUCKET_NAME,
Key: key,
Body: fileContent
}
await s3.putObject(params).promise();
resolve();
}).run();
})
res.send("success")
} catch(error){
console.log(error);
res.send(error);
}
});