Node.js 中实现HTTP文件下载_nodejs download

boyanx2个月前技术教程18

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

1. 文件下载介绍

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

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

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

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

需要设置的响应头

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

Content-Type: application/octet-stream
Content-Disposition: attachment; filename=MyFileName.ext

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

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

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

创建Express应用请参考:

http://itbilu.com/nodejs/npm/EJUJrGVsg.html

2.1 添加路由

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

上面的添加的两个路由分别用于:显示服务器文件、实现文件下载。

2.2 显示服务器文件

实现服务器文件的显示,要通过"fs"模块读取文件目录并进行文件/目录检查等。还需要使用"path"模块处理文件路径。首先引入这两个模块:

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

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

2.3 实现文件下载

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

文件下载实现代码如下:

来自:http://itbilu.com

交流群:564850876

标签: js下载文件

相关文章

浏览器大文件(百M以上)的上传下载实现技术

NGINX支持超大文件HTTP断点续传,VUE实现文件的分片上传,前端大文件上传处理方案,如何解决控件附件上传时超大附件无法上传的问题,完美解决B/S无法上传大文件解决方法,网页完美解决B/S无法上传...

js 通过流的方式进行下载_js下载文件流保存到本地

背景项目上需要用到多语言,项目设计语言选择是通过header传递的,如果直接用平时location.href下载并无法实现这个效果,然后在网上查阅了一些资料,可以通过流处理来实现下载,代码如下down...

原生js实现文件下载并设置请求头header

原生js实现文件下载并设置请求头headerconst token="自行定义表单令牌";//如果有 /** * 向指定路径发送下载请求 * @param{String} url 请求...

微信WeUI设计规范文件下载及使用方法

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知...

批量下载文件WEB_批量下载文件怎么导入到另外一个文件

批量下载文件WEB,批量下载文件c#,asp.net批量下载文件,jsp批量下载文件,java批量下载文件,php批量下载文件,.net core批量下载文件,webuploader批量下载文件,ja...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。