Tengo un botón de carga en mi página en el que el usuario puede hacer clic para cargar un video. Si el video es grande, el Lector de archivos de Javascript no puede manejarlo. Así que implementé una función que divide el video subido en fragmentos con la etiqueta 'data:application/octet-stream;base64' al principio. Mientras tanto, la función envía cada fragmento al backend de NodeJS, donde uso algunos enfoques 'fs' para fusionar el archivo de video y guardarlo como un archivo mp4 en mi disco. El problema es que el archivo está 'vacío'. Mi PC lo reconoce como un archivo mp4, no hay ningún error de formato de archivo incorrecto. Pero el video no tiene contenido y dura 0 segundos. ¿Cómo puedo fusionar fragmentos correctamente para que el archivo mp4 funcione?
Interfaz:
let reader; let file; const slice_size = 1024; const start_chunks_upload = (e) => { event.preventDefault(); reader = new FileReader(); file = e.target.files[0]; upload_file_chunks(0); } const upload_file_chunks = (start) => { const next_slice = start + slice_size + 1; const blob = file.slice(start, next_slice); reader.onloadend = (e) => { if (e.target.readyState !== FileReader.DONE) { return; } $.ajax({ type: 'POST', url: 'http://localhost:5000/video', data: { video: e.target.result.replace('data:application/octet-stream;base64,', ''), is_done: next_slice < file.size ? null : true, }, success: function(data) { const size_done = start + slice_size; const percent_done = Math.floor((size_done / file.size) * 100); console.log(percent_done + '%'); if (next_slice < file.size) { upload_file_chunks(next_slice); } else { console.log('done'); } } }); }; reader.readAsDataURL(blob); } video_upload_button.addEventListener('change', (e) => start_chunks_upload(e));
back-end:
let string = ''; app.post('/video', (req, res) => { string += req.body.video; if (req.body.is_done) { let buff = new Buffer.from(string, 'base64'); fs.writeFileSync('/one.mp4', buff); fs.writeFile("/two.mp4", string, 'base64', function(err) { console.log(err); }); fs.appendFile('/log.txt', string, function (err) { if (err) { console.log(err); } }) } else { return res.json({ok: 1,}); } })