最近我优化了几个新人写的动态表文件下载接口的性能瓶颈。我觉得很有必要将一篇文章总结成一篇文档,以提供有价值的参考。本文主要介绍两种实用的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,{
“内容类型”:“应用程序/h3制下载”,
内容-处置:附件;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,{
“内容类型”:“应用程序/h3制下载”,
内容-处置:附件;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下载文件的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!