最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

javascript - Download file in NodeJS - Stack Overflow

matteradmin5PV0评论

I am writing HTML WYSIWYG application. After a user edits a web page, they should be able to click a download button, and be prompted by their browser to save their edited web page. I do not want to store their edited web page on my server, but send the file to their local machine.

So far in my application, I am able to edit a template, grab its HTML when the user clicks the download button, and using NodeJS's fs.createWriteStream method, write the HTML to a newly created HTML file. However, it creates the file on my server instead of prompting the browser to save the file in a Downloads folder. I am using Socket.io to tell the server to download the HTML content.

After research, I figured out that in order to make the browser prompt the user to save a download file, the HTTP headers must be set using the Content-Disposition: attachment header.

In Summary, when the user clicks the download button in my application, what should I do so that a new file is created and saved directly on the users local puter instead of on my server?

This is what I have in my server.js file:

io.sockets.on('connection', function(socket) {
    socket.on('downloadHTML', function(data) {
        var file = fs.createWriteStream('PearlEdit-template-Martketing.html', {flags: 'w'})
                .write(data.html);
    });

});

I am writing HTML WYSIWYG application. After a user edits a web page, they should be able to click a download button, and be prompted by their browser to save their edited web page. I do not want to store their edited web page on my server, but send the file to their local machine.

So far in my application, I am able to edit a template, grab its HTML when the user clicks the download button, and using NodeJS's fs.createWriteStream method, write the HTML to a newly created HTML file. However, it creates the file on my server instead of prompting the browser to save the file in a Downloads folder. I am using Socket.io to tell the server to download the HTML content.

After research, I figured out that in order to make the browser prompt the user to save a download file, the HTTP headers must be set using the Content-Disposition: attachment header.

In Summary, when the user clicks the download button in my application, what should I do so that a new file is created and saved directly on the users local puter instead of on my server?

This is what I have in my server.js file:

io.sockets.on('connection', function(socket) {
    socket.on('downloadHTML', function(data) {
        var file = fs.createWriteStream('PearlEdit-template-Martketing.html', {flags: 'w'})
                .write(data.html);
    });

});
Share Improve this question asked Jan 2, 2014 at 6:46 RashadRashad 2456 silver badges15 bronze badges 2
  • 2 Just serve the file with the proper headers when the link is clicked, don't use websockets for that – adeneo Commented Jan 2, 2014 at 6:48
  • I'm not 100% sure what you mean. Could you elaborate? – Rashad Commented Jan 2, 2014 at 8:12
Add a ment  | 

1 Answer 1

Reset to default 3

You can simply use something like this (answer referenced from here)

app.get('/download', function(req, res){

  var file = __dirname + '/upload-folder/dramaticpenguin.MOV';

  var filename = path.basename(file);
  var mimetype = mime.lookup(file);

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);
});
Post a comment

comment list (0)

  1. No comments so far