Как сделать, чтобы огромный файл последовательно считывался и отправлялся post запросом? Node.JS FS Axios
Я пытаюсь отправлять большие видео размером 2-10ГБ post запросом через Axios. Чтобы считать файл, я использую fs.createReadStream с параметром highWaterMark: 10 * 1024 * 1024 (10мбайт), но проблема в том, что оперативная память забивается и далее axios выдаёт ошибку отправки. Как сделать, чтобы файл считывался последовательно, не забиваясь полностью в оперативку? Вот мой код:
async function uploadVideo(fileName) {
console.log(`Идет выгрузка видео: ${newTitleOfVideo} на сервера ВК...`);
//Засовываем название и описание видео в API
let par = {
name: newTitleOfVideo,
description: desc,
}
//URL для запроса URL выгрузки
let url = `https://api.vk.com/method/video.save?access_token=${accessToken}&v=5.199&group_id=${id}&wallpost=1&privacy_view=0&privacy_comment=0&compression=0`;
//Запрашиваем URL для выпуска видео и загружаем видео
axios.get(url, { params: par })
.then(({ data }) => {
let uploadURL = data.response['upload_url'];
uploadURL = uploadURL.replace('https://', 'http://');
vkVidId = data.response['video_id'];
const form = new FormData();
const fileStream = fs.createReadStream(fileName, {highWaterMark: 10 * 1024 * 1024});
form.append('video_file', fileStream, {
filename: 'file.mp4',
contentType: 'video/mp4',
});
// Используем getLength() для получения длины содержимого
form.getLength((err, length) => {
if (err) {
return console.log('Код ошибки 001. Ошибка отправки видео. Свяжитесь с @te4ers по ТГ или напишите в техподдержку в паблике ВК');
}
async function upload () {
if (uploadAtt < 10) {
axios.post(uploadURL, form, {
headers: {
...form.getHeaders(),
'Content-Length': fs.statSync(fileName).size,
},
maxContentLength: Infinity,
maxBodyLength: Infinity,
})
.then(() => {
fs.appendFileSync(uploadedPath, title);
console.log(`Видео ${newTitleOfVideo} успешно загружено!`);
title = "";
newTitleOfVideo = "";
fs.unlinkSync(fileName);
uploadAtt = 1;
let commUrl = `https://api.vk.com/method/video.createComment?access_token=${accessToken}&v=5.199&video_id=${vkVidId}&from_group=1&owner_id=-${id}&message=${comm}`;
axios.get(commUrl)
.then(() => {
showCount--;
console.log('Комментарий успешно оставлен');
counter++;
exec();
console.log(`Сейчас в очереди: ${showCount} видео`);
})
.catch((err) => {
console.log('Код ошибки 009. Неудалось оставить комментарий. Свяжитесь с @te4ers по ТГ или напишите в техподдержку в паблике ВК');
});
})
.catch((err) => {
uploadAtt++;
upload();
console.log(`Код ошибки 002. Попытка выгрузить видео номер ${uploadAtt}`);
return;
});
}
else {
console.log('Код ошибки 002. Неудалось выгрузить видео на сервера VK, достигнуто максимальное кол-во попыток. Начнётся загрузка следующего видео. Свяжитесь с @te4ers по ТГ или напишите в техподдержку в паблике ВК');
counter++;
showCount--;
exec();
}
}
upload();
});
})
.catch((err) => {
console.log('Код ошибки 003, неверный токен VK или ID паблика, обновите с помощью: изменить_данные.bat', err);
return;
});
}