nodejs实现文件下载功能,防止文本TXT类文件直接打开

本文介绍如何使用Node.js实现文件的下载功能,包括通过不同方式触发文件下载,并设置了响应头来确保文件能被正确下载而非在浏览器中打开。具体方法涉及直接访问文件、通过文件流下载及读取文件内容后响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

当直接访问的某个文件时,如果该文件是二进制等浏览器无法解析的文件,浏览器才会下载该文件,但如果浏览器可以自己解析该文件,则它会打开该文件并以自己的方式呈现出来,而不会下载,此时就需要设置消息响应头,告诉浏览器该文件需要下载而不是简单的打开。

实现方法如下,访问:http://localhost:3000/download?fileType=1&fileName=test.txt (fileType的值为1、2、3)
说明:下载文件必须放在public目录下
在app.js文件中加入以下代码
app.use('/download', index);

index.js文件

var express = require('express');
var router = express.Router();
var path = require('path');
var fs = require('fs');

/* GET home page. */
router.get('/', function(req, res, next) {
    var fileType = req.query.fileType;
    var fileName = req.query.fileName;

    if (fileType == 1) {
        //直接访问文件进行下载
        res.redirect(fileName);
    } else if (fileType == 2) {
        //以文件流的形式下载文件
        var filePath = path.join(__dirname, '../public/' + fileName);
        var stats = fs.statSync(filePath);
        var isFile = stats.isFile();
        if(isFile){
            res.set({
                'Content-Type': 'application/octet-stream', //告诉浏览器这是一个二进制文件
                'Content-Disposition': 'attachment; filename=' + fileName, //告诉浏览器这是一个需要下载的文件
                'Content-Length': stats.size  //文件大小
            });
            fs.createReadStream(filePath).pipe(res);
        } else {
            res.end(404);
        }
    } else if (fileType == 3) {
        //读取文件内容后再响应给页面
        var filePath = path.join(__dirname, '../public/' + fileName);
        var stats = fs.statSync(filePath);
        var isFile = stats.isFile();
        if (isFile) {
            fs.readFile(filePath, function(isErr, data){
                if (isErr) {
                    res.end("Read file failed!");
                    return;
                }
                res.set({
                    'Content-Type': 'application/octet-stream', //告诉浏览器这是一个二进制文件
                    'Content-Disposition': 'attachment; filename=' + fileName, //告诉浏览器这是一个需要下载的文件
                    'Content-Length': stats.size  //文件大小
                });
                res.end(data)
            })
        } else {
            res.end(404);
        }
    } else {
        res.end(404);
	}
});

module.exports = router;

完整的上传、下载项目,可在这里下载:nodejs实现简单的上传下载功能

### Node.js 连接和操作 MySQL 数据库 #### 安装依赖包 为了使 Node.js 能够与 MySQL 数据库交互,需要先安装 `mysql` 或者更新版本的 `mysql2` 模块。这可以通过 npm (Node Package Manager) 来完成。 ```bash npm install mysql2 ``` 此命令会下载必要的文件并将它们添加到项目的 node_modules 文件夹中[^2]。 #### 创建数据库连接 建立数据库连接涉及创建一个新的连接实例,并配置主机名、用户名、密码和其他参数来指定目标 MySQL 实例的位置及其认证信息。 ```javascript const mysql = require('mysql2'); // 建立连接 let connection = mysql.createConnection({ host: 'localhost', user: 'root', // 用户名 password: '', // 密码 database: 'testdb' // 使用哪个数据库 }); ``` 一旦定义好了连接对象,就可以调用 connect 方法打开连接: ```javascript connection.connect(function(err) { if (err) throw err; console.log("Connected!"); }); ``` 这段代码尝试连接到本地运行的一个名为 testdb 的 MySQL 数据库;如果成功,则打印 Connected! 否则抛出错误消息。 #### 执行 SQL 查询 有了活动的连接后,便可以开始发送 SQL 语句给服务器端执行。最常用的方式就是通过 query 函数传递字符串形式的 SQL 文本。 ```javascript connection.query( "SELECT * FROM users WHERE id = ?", [userId], function(error, results, fields){ if (error) throw error; // 结果集存储于results变量内 console.log(results); } ); ``` 这里展示了一个简单的 SELECT 查询例子,它接受一个占位符 (?) 和相应的值作为第二个参数列表的一部分,从而防止SQL注入攻击[^1]。 #### 关闭数据库连接 当所有的查询都完成后应当断开同数据库之间的链接以释放资源。 ```javascript connection.end(); ``` 以上就是在 Node.js 应用程序里实现对 MySQL 数据库的基本 CRUD 功能的过程概述。当然还有更多高级特性和优化技巧等待探索。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

password-u

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值