微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

浅析Node.js实现HTTP文件下载

前言

HTTP实现文件下载时,只要在服务器设置好相关响应头,并使用二进制传输文件数据即可,而客户端(浏览器)会根据响应头接收文件数据。而在Node.js中,设置好响应头后,读取文件流,再使用“.pipe()”方法将流转接到响应对象Response就可以实现一个简单的文件下载服务器。

1. 文件下载介绍

HTTP基于请求头和响应头实现状态交互,在得到服务器正确响应状态后,而客户端首先会解析响应头,并根据响应头来接收和展示数据(响应体)。对于文件下载来说,其实现过程如下:

1.客户端发起文件资源请求

2.服务器查找对应文件,并设置”Content-Type”、”Content-disposition”等响应头,分别用于表示文件的”MIME”类型及文件描述

3.客户端根据服务器返回的响应头解析和接收文件数据

需要设置的响应头

设置文件下载响应头时,除了常用的HTTP响应头外,比较重要是还要设置以下两个响应头:

rush:js;"> Content-Type: application/octet-stream Content-disposition: attachment; filename=MyFileName.ext

在上面的设置中,”Content-Type: application/octet-stream”告诉浏览器这是一个二进制文件,”Content-disposition”告诉浏览器这是一个需要下载的附件并告诉浏览器认的文件名。如果不添加Content-disposition”响应头,浏览器可能会下载或显示文件内容,不同浏览器的处理有所不同。

2. Node.js文件下载服务器实现

接下来我们基于Express 框架实现一个简单文件下载服务器,在这个服务器中主要包括两个功能

服务器文件的浏览

文件的下载

2.1 添加路由

创建Express应用后,添加如下两个路由:

rush:js;"> router.get('/files',function(req,res,next) { // 显示服务器文件 }); router.get('/file/:fileName',next) { // 实现文件下载 });

上面的添加的两个路由分别用于:

显示服务器文件、实现文件下载

2.2 显示服务器文件

实现服务器文件显示,要通过”fs”模块

读取文件目录

并进行

文件/目录检查

等。还需要使用”

path

”模块处理文件路径。首先引入这两个模块:

rush:js;"> const fs = require('fs'); const path = require('path');

显示服务器文件实现代码如下:

0) { var files = []; results.forEach(function(file){ if(fs.statSync(path.join(filePath,file)).isFile()){ files.push(file); } }) res.render('files',{files:files}); } else { res.end('当前目录下没有文件'); } }); });

上面代码中,读取目录后通过视图文件files.ejs显示可下载文件列表。其代码如下:

rush:xhtml;"> 下载<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a>选择

请选择下载文件

<% if(files.length>0) {%>
    <% files.forEach(function(file){ %>
  • <%})%>
<%} else {%>

没有可下载文件

<%}%>

2.3 实现文件下载

实现文件下载时,可以先读取文件一个Buffer”中,再通过”res.send()”或”res.end()”方法发送文件数据,也可以基于流(”Stream”)实现文件数据的发送。使用”Stream”实现文件下载时,可以使用”fs.createReadStream()”方法创建一个可读流,而响应对象Response一个可写流。这样,只需要通过”.pipe()”方法文件流转接到Response响应流中即可。

文件下载实现代码如下:

rush:js;"> router.get('/file/:fileName',next) { // 实现文件下载 var fileName = req.params.fileName; var filePath = path.join(__dirname,fileName); var stats = fs.statSync(filePath); if(stats.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); } });

总结

以上就是利用Node.js实现HTTP文件下载的全部内容,希望对大家学习Node.js有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...