Я хочу разрешить клиенту загружать большой видеофайл и сохранять файл на сервере.
У меня есть файл ввода <input type="file" name="videoFile" id="videoFile" />
на стороне клиента.
После того, как клиент выбрал свой файл (видео), я анализирую его в Blob следующим образом:
function fileToBlob(file) {
return new Promise((resolve, reject) => {
const mime = file.type;
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = evn => resolve(new Blob([evn.target.result], { type: file.type }));
reader.onerror = error => reject(error);
});
}
Затем я отправил его на сервер, используя socket.io
.
Остальной код клиента:
fileToBlob($("#videoFile")[0].files[0]).then(function(blob) {
socket.emit(
"upload-video",
$("#courseName").val(),
$("#videoName").val(),
blob
);
});
На сервере я перехватил событие "upload-video"
:
socket.on("upload-video", function(courseName, videoName, blob) {
fs.writeFileSync(
`public/courses/${courseName}/${videoName}.mp4`,
Buffer.from(new Uint8Array(blob))
);
});
Теперь он отлично работает для небольших видеофайлов , но в тот момент, когда я попробовал видеофайл 450 МБ, ничего не произошло.
Кто-нибудь может знать, почему и как это исправить? Спасибо!
ОБНОВЛЕНИЕ: После небольшого тестирования я думаю, что socket.io
не может emit
большие данные.
Это правда? И если да, то как это исправить?