如何用Node.js和HTML实现正确的文件下载链接?
问题原因
你的Node.js服务器当前逻辑是所有请求都返回index.html内容,哪怕请求的是examplefile.txt,服务器依然返回HTML页面代码,所以下载到的不是目标文件。
解决方法
修改服务器代码,根据请求的URL路径区分处理:如果请求的是目标下载文件,就读取对应文件并设置正确的响应头;否则返回HTML页面。
修改后的Node.js服务器代码:
const fs = require('fs'); const http = require('http'); const port = 25565; const server = http.createServer(function(req, res) { // 判断请求的是下载文件还是HTML页面 if (req.url === '/examplefile.txt') { // 读取目标文件 fs.readFile('./examplefile.txt', function(error, data) { if (error) { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.write('File not found'); res.end(); console.log(error); return; } // 设置正确的响应头,触发下载 res.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Disposition': 'attachment; filename="examplefile.txt"' }); res.write(data); res.end(); console.log('File downloaded'); }); } else { // 返回HTML页面 fs.readFile("index.html", function(error, data) { if (error) { res.writeHead(404, { "Content-type": "text/html" }); res.write('<h1>file not found - 404</h1>'); console.log(error); } else { res.writeHead(200, { 'Content-Type': 'text/html' }); res.write(data); console.log('Served HTML page'); } res.end(); }); } }); server.listen(port, function(error) { if (error) { console.log('something happened bad', error); } else { console.log('server working on port ' + port); } });
关键说明
- 请求路径判断:通过
req.url识别请求的资源,区分处理HTML页面和下载文件。 - 响应头设置:针对下载文件,设置
Content-Type为文件对应的MIME类型(文本文件用text/plain),同时添加Content-Disposition头指定为附件,确保浏览器触发下载行为。 - 错误处理:单独处理文件不存在的情况,返回404提示。
注意:确保examplefile.txt和服务器代码、index.html在同一目录下,否则需调整文件路径。
内容的提问来源于stack exchange,提问作者Piet Vlek
相关产品推荐
相关产品推荐

