最近我优化了几个新人写的动态表文件下载接口的性能瓶颈。我觉得很有必要将一篇文章总结成一篇文档,以提供有价值的参考。本文主要介绍两种实用的Node.js下载文件的方法,有需要的朋友可以参考一下。
目录
第一种方法是使用本机http模块。第二种方式是使用Express Axios下载文件,汇总并设置响应头返回数据流。
第一种方式:使用原生的http模块
我们只需要使用node.js的两个原生模块,fs和http,不需要安装第三方模块就可以下载文件。代码如下:
var fs=require(' fs ');
var http=require(' http ');
var server=http . create server();
server.on('请求',函数(请求,响应){
//获取请求URL
var url=request.url
//如果是下载文件的URL,会进行判断和处理。
if(URL==='/download/hello . txt '){
//提取文件名hello.txt
var name=URL . substring(URL . lastindexof('/'));
//创建一个可读流,读取当前项目目录下的hello.txt文件。
var RS=fs . create readstream(_ _ dirname '/' name);
//设置响应请求头,200表示成功状态码,headers表示设置请求头。
response.writeHead(200,{
“内容类型”:“应用程序/strong制下载”,
内容-处置':'附件;filename=' name
});
//将可读流传递给响应对象response
rs.pipe(响应);
}
});
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发送。
!文档类型html
html lang='en '
头
meta charset='UTF-8 '
!axios.js简介-
script src=' https://cdn . jsdelivr . net/NPM/axios/dist/axios . min . js '/script
/头
身体
按钮onclick='downloadFile()'下载/按钮
/body
脚本
函数downloadFile() {
axios({
URL:“/文件/下载”,
方法:' POST ',
response type:“blob”
}).然后(函数(响应){
//下载响应返回的数据为文件,修复代码。
//将响应数据作为Blob类型处理
var Blob=new Blob([response . data]);
//创建一个URL对象
var url=窗口。URL . createobjecturl(blob);
//创建一个A标记
var a=document . createelement(' a ');
a.href=url
a . download=' hello . txt ';//在此指定下载文件的文件名
a . click();
//释放先前创建的URL对象
窗户。URL . revokeobjecturl(URL);
}).catch(函数(原因){
console.log(原因)
})
}
/脚本
/html
Index.js:使用express呈现index.html页面并处理下载请求。
var fs=require(' fs ');
var express=require(' express ');
var app=express();
//渲染index.html,与下载逻辑无关
app.get('/index.html ',函数(请求,响应){
fs.readFile('index.html ',function (err,data) {
如果(!呃){
response.end(数据);
}
});
});
//处理下载文件的请求
app . post('/文件/下载',函数(请求,响应){
var name=' hello.txt//要下载的文件名
var path=_ _ dirname '/' name;//将要下载的文件的路径指定为当前项目目录下的hello.txt文件。
var f=fs . createreadstream(path);
response.writeHead(200,{
“内容类型”:“应用程序/strong制下载”,
内容-处置':'附件;filename=' name
});
f .管道(响应);
});
//监听端口,相当于原来的server.listen()
app.listen(8888,function () {
console.log('应用程序正在端口8888运行。');
});
还可以通过response.set()方法设置响应头:
response.set({
content-type ':' application/octet-stream ',//告诉浏览器这是一个二进制文件
内容-处置':'附件;Filename=' name//告诉浏览器这是一个需要下载的文件。
});
总结
下载文件其实很简单,任何语言都是如此:
第一步是设置响应头。第二步是返回数据流。
设置响应头
下载文件需要设置的响应头是Content-Type和Content-Disposition。响应头与编程语言无关,是通用的。
“content-type”:“application/octet-stream”表示这是一个二进制文件。
内容-处置':'附件;' Filename=hello.txt '表示这是一个需要下载的附件,并告诉浏览器默认文件名。
返回数据流
读取要下载的文件,以二进制流的形式响应客户端。
关于Node.js下载文件的两种实用方法的文章到此为止,关于Node.js下载文件的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。