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

 

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

实现方法如下,访问: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实现简单的上传下载功能

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

password-u

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

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

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

打赏作者

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

抵扣说明:

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

余额充值