前言
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 框架实现一个简单文件下载服务器,在这个服务器中主要包括两个功能:服务器文件的浏览、文件的下载。
2.1 添加路由
创建Express应用后,添加如下两个路由:
router.get('/files', function(req, res, next) { // 显示服务器文件 }); router.get('/file/:fileName', function(req, res, next) { // 实现文件下载 });
上面的添加的两个路由分别用于:显示服务器文件、实现文件下载。
2.2 显示服务器文件
实现服务器文件的显示,要通过”fs
”模块读取文件目录并进行文件/目录检查等。还需要使用”path”模块处理文件路径。首先引入这两个模块:
const fs = require('fs'); const path = require('path');
显示服务器文件实现代码如下:
router.get('/files', function(req, res, next) { // 显示服务器文件 // 文件目录 var filePath = path.join(__dirname, './'); fs.readdir(filePath, function(err, results){ if(err) throw err; if(results.length>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
”显示可下载文件列表。其代码如下:
<!DOCTYPE html> <html> <head> <title>下载文件选择</title> </head> <body> <h1>请选择下载文件:</h1> <% if(files.length>0) {%> <ul> <% files.forEach(function(file){ %> <li> <a href="/file/<%- file %>" target="_blank"><%- file %></a> </li> <%})%> </ul> <%} else {%> <p>没有可下载文件…</p> <%}%> </body> </html>
2.3 实现文件下载
实现文件下载时,可以先读取文件到一个”Buffer
”中,再通过”res.send()”
或”res.end()”
方法发送文件数据,也可以基于流(”Stream
”)实现文件数据的发送。使用”Stream
”实现文件下载时,可以使用”fs.createReadStream()”
方法创建一个可读流,而响应对象Response
是一个可写流。这样,只需要通过”.pipe()”
方法将文件流转接到Response
响应流中即可。
文件下载实现代码如下:
router.get('/file/:fileName', function(req, res, 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有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]