Express+Nodejs 下的页面中通过文件链接下载文件
Express+Nodejs 下的页面中通过文件链接下载文件
之前在做页面时候只要给一个a 标签的href属性赋值为要下载的文件在服务器的路径就能点击下载,但这次在nodejs服务器下请求 http://XXXX.XXXX.XXXX.XXXX/excel/xx.xlsx 却总是提示can’t请求某某页面,着实很奇怪,后来想到到public下的静态资源肯定能访问吧,于是乎就在app.use(express.static(__dirname + “/public”));
后面紧接了一句app.use(express.static(__dirname + “/excel”));
,确实成功下载到了
Express + Node.js 下的页面中通过文件链接下载文件
在使用 Express 框架搭建的 Node.js 服务器中,有时需要让用户通过点击链接来下载文件。本文将详细介绍如何实现这一功能,并提供相应的示例代码。
问题描述
假设你的项目结构如下:
myproject/
├── app.js
├── public/
│ └── index.html
└── excel/
└── xx.xlsx
你希望用户可以通过点击 <a>
标签直接下载 excel
目录下的文件。但是当你尝试通过以下方式访问文件时:
<a href="http://XXXX.XXXX.XXXX.XXXX/excel/xx.xlsx">下载文件</a>
却遇到了 can't request the page
的错误提示。
解决方案
你需要确保 Express 能够正确处理静态文件的请求。默认情况下,Express 只会处理 public
目录下的静态文件。因此,你需要添加额外的配置来使 excel
目录中的文件也能被访问。
在你的 app.js
文件中,添加以下代码:
const express = require('express');
const path = require('path');
const app = express();
// 设置 public 目录下的静态文件
app.use(express.static(path.join(__dirname, 'public')));
// 设置 excel 目录下的静态文件
app.use('/excel', express.static(path.join(__dirname, 'excel')));
// 其他路由和中间件...
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
这里的关键点在于:
- 使用
express.static
中间件来指定静态文件的目录。 - 第二个参数
/excel
是 URL 前缀,这样你可以通过http://localhost:3000/excel/xx.xlsx
访问文件。
示例 HTML 页面
在 public/index.html
中添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Download File Example</title>
</head>
<body>
<h1>Click to Download File</h1>
<a href="/excel/xx.xlsx">下载 xx.xlsx</a>
</body>
</html>
现在,当你访问 http://localhost:3000
并点击链接时,浏览器应该能够正确地下载 excel/xx.xlsx
文件。
总结
通过上述步骤,你可以轻松地在 Express + Node.js 应用中设置文件下载功能。确保正确配置静态文件路径,并使用适当的 URL 前缀来访问这些文件。
因为express进行了路由控制,不是像php,asp原生那样请求路径对应于文件路径。除了你提到的static资源,其它的请求路径都要配置。 除了使用static的方式,还可以定义路由,然后在后台程序用res.download方法来下载文件,并且可以方便管理文件权限和信息。 比如路由
app.get('/attachment/:id',function(req,res,next){
//..db get file realpath
res.download(realpath,filename);
});
在Express+Node.js环境下,通过文件链接下载文件时,如果你直接使用一个a标签的href属性指向服务器上的文件路径(如http://XXXX.XXXX.XXXX.XXXX/excel/xx.xlsx
),可能会遇到无法访问的问题。这是因为Express默认不会直接暴露这些路径供外部访问。
要解决这个问题,你可以将包含文件的目录作为静态资源目录让Express处理,这样不仅可以访问到文件,还可以实现文件下载的功能。在你的案例中,已经在app.use(express.static(__dirname + "/public"));
之后紧接着添加了app.use(express.static(__dirname + "/excel"));
,这一步是正确的做法。这样做之后,你可以通过URL访问Excel文件,并且浏览器会自动尝试下载文件。
为了更明确地控制文件下载行为,你也可以通过路由来处理文件下载。例如:
const express = require('express');
const path = require('path');
const app = express();
// 设置静态资源目录
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'excel')));
// 处理特定文件下载的路由
app.get('/download/:filename', (req, res) => {
const filePath = path.join(__dirname, 'excel', req.params.filename);
res.download(filePath); // 相当于设置了Content-Disposition为attachment
});
app.listen(3000, () => console.log('Server running on port 3000'));
在这个例子中,当你访问http://localhost:3000/download/xx.xlsx
时,服务器将会发送该文件以供下载。这种方式提供了更多的灵活性,比如可以验证用户权限或者添加额外的HTTP头信息。