As you mentioned, you can convert the image to base64 using FileReader.readAsDataURL and send the encoded string, and decode it on the server:
document.getElementById('file').addEventListener('change', function() { const reader = new FileReader(); reader.onload = function() { const base64 = this.result.replace(/.*base64,/, ''); socket.emit('image', base64); }; reader.readAsDataURL(this.files[0]); }, false);
socket.on('image', async image => { const buffer = Buffer.from(image, 'base64'); await fs.writeFile('/tmp/image', buffer).catch(console.error); // fs.promises });
Or better use FileReader.readAsArrayBuffer to get an array of bytes that you'll send to the server.
document.getElementById('file').addEventListener('change', function() { const reader = new FileReader(); reader.onload = function() { const bytes = new Uint8Array(this.result); socket.emit('image', bytes); }; reader.readAsArrayBuffer(this.files[0]); }, false);
socket.on('image', async image => { // image is an array of bytes const buffer = Buffer.from(image); await fs.writeFile('/tmp/image', buffer).catch(console.error); // fs.promises });
To receive from the server:
// Server side socket.emit('image', image.toString('base64')); // image should be a buffer
// Client side socket.on('image', image => { // create image with const img = new Image(); // change image type to whatever you use, or detect it in the backend // and send it if you support multiple extensions img.src = `data:image/jpg;base64,${image}`; // Insert it into the DOM });