Node.js send file to client

html, javascript, node.js

Solution

You need to set some header flags;

res.writeHead(200, {
    'Content-Type': 'audio/mpeg',
    'Content-Length': stat.size,
    'Content-Disposition': 'attachment; filename=your_file_name'
});

For replacing streaming with download;

var file = fs.readFile(filePath, 'binary');

res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'audio/mpeg');
res.setHeader('Content-Disposition', 'attachment; filename=your_file_name');
res.write(file, 'binary');
res.end();

Problem

Hello there I have been trying to send a file from node.js to the client. My code works however when the client goes to the specified url (`/helloworld/hello.js/test`) it streams the file. Accessing it from Google Chrome makes the file (.mp3) play in a player. My goal is to have the client's browser download the file and ask the client where he wants to store it, not stream it on the website. ``` http.createServer(function(req, res) { switch (req.url) { case '/helloworld/hello.js/test': var filePath = path.join(__dirname, '/files/output.mp3'); var stat = fileSystem.statSync(filePath); res.writeHead(200, { 'Content-Type': 'audio/mpeg', 'Content-Length': stat.size }); var readStream = fileSystem.createReadStream(filePath); // We replaced all the event handlers with a simple call to readStream.pipe() readStream.on('open', function() { // This just pipes the read stream to the response object (which goes to the client) readStream.pipe(res); }); readStream.on('error', function(err) { res.end(err); }); } }); ```

Original source