Node.js实现下载文件的两种实用方式

 更新时间:2022年09月05日 11:08:49   作者:二木成林  
最近优化了几个新人写出的动态表格文件下载接口的性能瓶颈,感觉非常有必要总结一篇文章作为文档来抛砖引玉,这篇文章主要给大家介绍了关于Node.js实现下载文件的两种实用方式,需要的朋友可以参考下

第一种方式:使用原生的http模块

我们仅需要用到fshttp两个node.js的原生模块,不需要安装第三方模块,就可以实现文件的下载。代码如下:

var fs = require('fs');
var http = require("http");

var server = http.createServer();

server.on("request", function (request, response) {
    // 获取请求URL
    var url = request.url;
    // 如果是下载文件的URL,则判断进行处理
    if (url === '/download/hello.txt') {
        // 提取文件名hello.txt
        var name = url.substring(url.lastIndexOf('/'));
        // 创建可读流,读取当前项目目录下的hello.txt文件
        var rs = fs.createReadStream(__dirname + "/" + name);
        // 设置响应请求头,200表示成功的状态码,headers表示设置的请求头
        response.writeHead(200, {
            'Content-Type': 'application/force-download',
            'Content-Disposition': 'attachment; filename=' + name
        });
        // 将可读流传给响应对象response
        rs.pipe(response);
    }
});

server.listen(8888, function () {
    console.log("服务器启动成功,可以通过 http://127.0.0.1:8888 来进行访问");
});

然后可以通过http://127.0.0.1:8888/download/hello.txt下载文件。

第二种方式:使用Express+Axios下载文件

前端通过axios发送GET或者POST请求来进行文件的下载,关键是对响应回来的文件数据进行处理。

index.html:前端页面,通过点击按钮来进行下载文件,而请求是通过axios来发送的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 引入axios.js -->
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<button onclick="downloadFile()">下载</button>
</body>
<script>
    function downloadFile() {
        axios({
            url: '/file/download',
            method: 'POST',
            responseType: 'blob'
        }).then(function (response) {
            // 将响应回来的数据下载为文件,固定代码
            // 将响应数据处理为Blob类型
            var blob = new Blob([response.data]);
            // 创建一个URL对象
            var url = window.URL.createObjectURL(blob);
            // 创建一个a标签
            var a = document.createElement("a");
            a.href = url;
            a.download = "hello.txt";// 这里指定下载文件的文件名
            a.click();
            // 释放之前创建的URL对象
            window.URL.revokeObjectURL(url);
        }).catch(function (reason) {
            console.log(reason)
        })
    }
</script>
</html>

index.js:使用express来渲染index.html页面,并且来处理下载请求。

var fs = require('fs');
var express = require('express');

var app = express();

// 渲染index.html,跟下载逻辑无关
app.get('/index.html', function (request, response) {
    fs.readFile('index.html', function (err, data) {
        if (!err) {
            response.end(data);
        }
    });
});

// 处理下载文件的请求
app.post('/file/download', function (request, response) {
    var name = "hello.txt";// 待下载的文件名
    var path = __dirname + "/" + name;// 待下载文件的路径,指定为当前项目目录下的hello.txt文件
    var f = fs.createReadStream(path);
    response.writeHead(200, {
        'Content-Type': 'application/force-download',
        'Content-Disposition': 'attachment; filename=' + name
    });
    f.pipe(response);
});

// 监听端口,相当于原来的server.listen()
app.listen(8888, function () {
    console.log("app is running at port 8888.");
});

又可以通过response.set()方法来设置响应头:

    response.set({
        'Content-Type': 'application/octet-stream',// 告诉浏览器这是一个二进制文件
        'Content-Disposition': 'attachment; filename=' + name// 告诉浏览器这是一个需要下载的文件
    });

总结

下载文件其实很简单,在哪种语言里都是这样:

第一步,设置响应头。第二步,返回数据流。

设置响应头

下载文件需要设置的响应头是Content-TypeContent-Disposition,响应头与编程语言无关,是通用的。

'Content-Type': 'application/octet-stream'表示这是一个二进制文件。

'Content-Disposition': 'attachment;filename=hello.txt'表示这是一个需要下载的附件,并且告诉浏览器默认文件名。

返回数据流

读取要下载的文件,以二进制流的形式响应给客户端。

到此这篇关于Node.js实现下载文件的两种实用方式的文章就介绍到这了,更多相关Node.js下载文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用nvm实现多个nodejs版本的快速切换

    使用nvm实现多个nodejs版本的快速切换

    NodeJS的升级比较快,在开发中要使用最新的版本,必须经常升级,但对于一些老项目可能又要使用低版本的NodeJS,使用nvm工具可以方便的管理下载的NodeJS版本,并通过命令实现NodeJS版本的快速切换,需要的朋友可以参考下
    2024-09-09
  • package.json版本号符号^和~前缀的区别

    package.json版本号符号^和~前缀的区别

    这篇文章介绍了package.json版本号符号^和~前缀的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Node.js开发之访问Redis数据库教程

    Node.js开发之访问Redis数据库教程

    这篇文章主要介绍了Node.js开发之访问Redis数据库教程,本文讲解了安装Redis的Node.js驱动、编写测试程序以及npm远程服务器连接十分缓慢的解决方法,需要的朋友可以参考下
    2015-01-01
  • Node.js + Redis Sorted Set实现任务队列

    Node.js + Redis Sorted Set实现任务队列

    本文给大家分享的是使用Node.js + Redis Sorted Set实现任务队列的方法示例,非常的实用,有需要的小伙伴可以参考下
    2016-09-09
  • AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录

    AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录

    这篇文章主要介绍了AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录,需要的朋友可以参考下
    2015-01-01
  • NodeJS简单实现WebSocket功能示例

    NodeJS简单实现WebSocket功能示例

    这篇文章主要介绍了NodeJS简单实现WebSocket功能,结合具体实例形式分析了nodejs实现WebSocket通信功能的客户端与服务器端相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • nodeJS进程管理器pm2的使用

    nodeJS进程管理器pm2的使用

    这篇文章主要介绍了nodeJS进程管理器pm2的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Nodejs alpine基础之docker镜像构建

    Nodejs alpine基础之docker镜像构建

    这篇文章主要为大家介绍了Nodejs alpine基础之docker镜像构建,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • node.js平台下的mysql数据库配置及连接

    node.js平台下的mysql数据库配置及连接

    本文主要介绍了node.js平台下的mysql数据库配置及连接的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • Node.js和MongoDB实现简单日志分析系统

    Node.js和MongoDB实现简单日志分析系统

    这篇文章主要介绍了Node.js和MongoDB实现简单日志分析系统,本文给出了服务器端、客户端、图表生成、Shell自动执行等功能的实现代码,需要的朋友可以参考下
    2015-04-04

最新评论