七弈智慧• 工作室

使用Node.js从阿里云OSS下载文件的完整教程

2025-05-22 10:44:23 阅读(295)

在本教程中,我们将学习如何使用 Express 和 ali-oss 模块创建一个动态文件下载路由。这个路由可以根据用户请求的文件名动态生成对应的 OSS 文件下载链接,并将用户重定向到该链接,以便进行文件下载。

步骤 1: 安装依赖

首先,确保你已经安装了 Express 和 ali-oss 模块。如果没有安装,可以使用 npm 或 yarn 进行安装:

bash
npm install express ali-oss

或者使用 yarn:

bash
yarn add express ali-oss

步骤 2: 创建路由模块

在你的项目中创建一个新的路由模块,例如 router_oss.js,并在其中编写路由处理逻辑。我们将使用正则表达式来处理动态的文件下载请求。

javascript
// router_oss.js

const express = require('express');
const router = express.Router();
const OSS = require('ali-oss');

// 创建 OSS 客户端实例
const client = new OSS({
  region: 'oss-cn-hangzhou',
  accessKeyId: 'your_access_key_id',
  accessKeySecret: 'your_access_key_secret',
  bucket: 'your_bucket_name'
});

// 处理文件下载请求
router.get(/^\/(.+)/, async (req, res) => {
  const filename = req.params[0];

  try {
    // 生成文件下载链接
    const result = await client.signatureUrl(filename, { expires: 3600 });
    // 重定向到文件下载链接
    res.redirect(result);
  } catch (err) {
    console.error('Error:', err);
    res.status(500).send('Internal Server Error');
  }
});

module.exports = router;

步骤 3: 在主应用程序中使用路由模块

在你的主应用程序文件(例如 app.jsindex.js)中,引入刚刚创建的路由模块,并将其挂载到适当的路径上。

javascript
// app.js 或 index.js

const express = require('express');
const app = express();
const routerOSS = require('./router_oss'); // 替换成你的路由模块文件路径

// 将 OSS 路由挂载到根路径下
app.use('/', routerOSS);

// 启动服务器
const port = 3000; // 你想要监听的端口号
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

步骤 4: 测试

启动你的服务器,并在浏览器中访问 http://localhost:3000/your_file_name,将 your_file_name 替换为实际的文件名。如果一切正常,你应该能够重定向到相应的 OSS 文件下载链接。

通过这个教程,你学会了如何使用 Express 和 ali-oss 模块创建一个动态文件下载路由,并通过正则表达式来实现灵活的路径匹配。这样,无论用户请求的文件是在哪个目录下,都可以正确生成对应的下载链接。

接口页面--全局数据:

site-> {"id":1,"name":"七弈智慧","domain":"doc.7yi.link","email":"13346163791@qq.com","wx":null,"icp":"浙ICP备2023022652号-1","code":"","json":{"siteSubtitle":"• 工作室"},"title":"七弈国象-连接七弈 智慧人生","keywords":"国际象棋,棋谱,pgn,","description":"国际象棋站","createdAt":null,"updatedAt":"2025-04-14T01:07:55.000Z","template":null,"appid":null,"secret":null}

111-->• 工作室

nav-> [{"id":13,"pid":0,"name":"日常工作杂记","pinyin":"richanggongzuozaji","path":"/richanggongzuozaji","sort":4,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0","children":[{"id":14,"pid":13,"name":"前端","pinyin":"qianduan","path":"/cmsgaijin/qianduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":15,"pid":13,"name":"后端","pinyin":"houduan","path":"/richanggongzuozaji/houduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":16,"pid":13,"name":"总结","pinyin":"zongjie","path":"/kaifariji/zongjie","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":17,"pid":13,"name":"工作计划","pinyin":"gongzuojihua","path":"/cmsgaijin/gongzuojihua","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":22,"pid":13,"name":"炒股养棋","pinyin":"chaoguyangqi","path":"/chaoguyangqi","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":23,"pid":13,"name":"cx13","pinyin":"cx13","path":"/kaifariji/cx13","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":24,"pid":13,"name":"时限学堂","pinyin":"shixianxuetang","path":"/richanggongzuozaji/shixianxuetang","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":25,"pid":13,"name":"运营","pinyin":"yunying","path":"/richanggongzuozaji/yunying","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"}]},{"id":18,"pid":0,"name":"国象练习","pinyin":"guoxianglianxi","path":"/guoxianglianxi","sort":3,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":19,"pid":0,"name":"信息公布","pinyin":"xinxigongbu","path":"/xinxigongbu","sort":6,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0","children":[{"id":20,"pid":19,"name":"业界消息","pinyin":"yejiexiaoxi","path":"/qiyiguoxiang/yejiexiaoxi","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":21,"pid":19,"name":"七弈动态","pinyin":"qiyidongtai","path":"/xinxigongbu/qiyidongtai","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"}]}]

category-> [{"id":13,"pid":0,"name":"日常工作杂记","pinyin":"richanggongzuozaji","path":"/richanggongzuozaji","sort":4,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0","children":[{"id":14,"pid":13,"name":"前端","pinyin":"qianduan","path":"/cmsgaijin/qianduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":15,"pid":13,"name":"后端","pinyin":"houduan","path":"/richanggongzuozaji/houduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":16,"pid":13,"name":"总结","pinyin":"zongjie","path":"/kaifariji/zongjie","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":17,"pid":13,"name":"工作计划","pinyin":"gongzuojihua","path":"/cmsgaijin/gongzuojihua","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":22,"pid":13,"name":"炒股养棋","pinyin":"chaoguyangqi","path":"/chaoguyangqi","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":23,"pid":13,"name":"cx13","pinyin":"cx13","path":"/kaifariji/cx13","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":24,"pid":13,"name":"时限学堂","pinyin":"shixianxuetang","path":"/richanggongzuozaji/shixianxuetang","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":25,"pid":13,"name":"运营","pinyin":"yunying","path":"/richanggongzuozaji/yunying","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"}]},{"id":14,"pid":13,"name":"前端","pinyin":"qianduan","path":"/cmsgaijin/qianduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":15,"pid":13,"name":"后端","pinyin":"houduan","path":"/richanggongzuozaji/houduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":16,"pid":13,"name":"总结","pinyin":"zongjie","path":"/kaifariji/zongjie","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":17,"pid":13,"name":"工作计划","pinyin":"gongzuojihua","path":"/cmsgaijin/gongzuojihua","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":18,"pid":0,"name":"国象练习","pinyin":"guoxianglianxi","path":"/guoxianglianxi","sort":3,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":19,"pid":0,"name":"信息公布","pinyin":"xinxigongbu","path":"/xinxigongbu","sort":6,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0","children":[{"id":20,"pid":19,"name":"业界消息","pinyin":"yejiexiaoxi","path":"/qiyiguoxiang/yejiexiaoxi","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":21,"pid":19,"name":"七弈动态","pinyin":"qiyidongtai","path":"/xinxigongbu/qiyidongtai","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"}]},{"id":20,"pid":19,"name":"业界消息","pinyin":"yejiexiaoxi","path":"/qiyiguoxiang/yejiexiaoxi","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":21,"pid":19,"name":"七弈动态","pinyin":"qiyidongtai","path":"/xinxigongbu/qiyidongtai","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":22,"pid":13,"name":"炒股养棋","pinyin":"chaoguyangqi","path":"/chaoguyangqi","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":23,"pid":13,"name":"cx13","pinyin":"cx13","path":"/kaifariji/cx13","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":24,"pid":13,"name":"时限学堂","pinyin":"shixianxuetang","path":"/richanggongzuozaji/shixianxuetang","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":25,"pid":13,"name":"运营","pinyin":"yunying","path":"/richanggongzuozaji/yunying","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"}]

friendlink-> [{"id":1,"title":"七弈国象首页","link":"https://www.7yi.link","sort":0,"createdAt":"2023-07-22T14:59:55.000Z"}]

base_url-> /public/template/default

frag--->{"record":"<p style=\"text-align: center;\"><a href=\"http://beian.miit.gov.cn/\" target=\"_blank\" rel=\"noopener\">浙ICP备2023022652号-1</a></p>","footer-guanyu":"","footer-7yi":"","footer-chess":"","footer-fe":"","chanyue-introduce":"<p>七弈国象:专注于国际象棋开局与战术学习的网站</p>\n<ul>\n<li>国际象棋相关工具开发:<br>\n<ul>\n<li>记谱训练</li>\n<li>识谱工具</li>\n</ul>\n</li>\n<li>国象相关产品\n<ul>\n<li>记录本</li>\n</ul>\n</li>\n<li>电商网站\n<ul>\n<li>畅享一三</li>\n</ul>\n</li>\n<li>通用后台<br>\n<ul>\n<li>7Link通用后台开发系统&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</li>\n</ul>\n</li>\n</ul>","copyright":"<p style=\"text-align: center;\">杭州七弈智慧科技有限公司版权所有</p>","ad":"<p style=\"text-align: center;\"><a href=\"https://7yi.link/stock/chess/web-mobile/\" target=\"_blank\" rel=\"noopener\"> <img style=\"display: block; margin-left: auto; margin-right: auto; max-width: 100%; height: auto;\" src=\"/public/uploads/default/2023/09/21/1695286791855_mceu_83563456911695286788809.png.png\"> </a></p>\n<p style=\"text-align: center;\"><a href=\"https://7yi.link/stock/chess/web-mobile/\" target=\"_blank\" rel=\"noopener\">开局树学习</a></p>"}

tag--->[{"id":8,"name":"双马防御","path":"shuangmafangyu"},{"id":7,"name":"开发","path":"kaifa"},{"id":6,"name":"伦敦体系","path":"lunduntixi"},{"id":5,"name":"俄罗斯防御","path":"eluosifangyu"},{"id":1,"name":"cms","path":"cms"}]

-----------

position------>[{"id":13,"pid":0,"name":"日常工作杂记","pinyin":"richanggongzuozaji","path":"/richanggongzuozaji","sort":4,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0","children":[{"id":14,"pid":13,"name":"前端","pinyin":"qianduan","path":"/cmsgaijin/qianduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":15,"pid":13,"name":"后端","pinyin":"houduan","path":"/richanggongzuozaji/houduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":16,"pid":13,"name":"总结","pinyin":"zongjie","path":"/kaifariji/zongjie","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":17,"pid":13,"name":"工作计划","pinyin":"gongzuojihua","path":"/cmsgaijin/gongzuojihua","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":22,"pid":13,"name":"炒股养棋","pinyin":"chaoguyangqi","path":"/chaoguyangqi","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":23,"pid":13,"name":"cx13","pinyin":"cx13","path":"/kaifariji/cx13","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":24,"pid":13,"name":"时限学堂","pinyin":"shixianxuetang","path":"/richanggongzuozaji/shixianxuetang","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},{"id":25,"pid":13,"name":"运营","pinyin":"yunying","path":"/richanggongzuozaji/yunying","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"}]},{"id":15,"pid":13,"name":"后端","pinyin":"houduan","path":"/richanggongzuozaji/houduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"}]

navSub------>{"cate":{"id":15,"pid":13,"name":"后端","pinyin":"houduan","path":"/richanggongzuozaji/houduan","sort":0,"target":"0","status":"0","list_view":"list.html","article_view":"article.html","seo_title":"","seo_keywords":"","seo_description":"","type":"0"},"id":15}

article------>{"id":174,"cid":15,"sub_cid":"","title":"使用Node.js从阿里云OSS下载文件的完整教程","short_title":"","tag_id":"","attr":"","seo_title":"","seo_keywords":"","seo_description":"","source":"","author":"","description":"","img":"","content":"<p>在本教程中,我们将学习如何使用 Express 和 ali-oss 模块创建一个动态文件下载路由。这个路由可以根据用户请求的文件名动态生成对应的 OSS 文件下载链接,并将用户重定向到该链接,以便进行文件下载。</p>\n<h4>步骤 1: 安装依赖</h4>\n<p>首先,确保你已经安装了 Express 和 ali-oss 模块。如果没有安装,可以使用 npm 或 yarn 进行安装:</p>\n<div class=\"dark bg-gray-950 rounded-md\">\n<div class=\"flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md\">bash<span class=\"\" data-state=\"closed\"><button class=\"flex gap-1 items-center\">Copy code</button></span></div>\n<pre><code class=\"language-bash\">npm install express ali-oss\n</code></pre>\n</div>\n<p>或者使用 yarn:</p>\n<div class=\"dark bg-gray-950 rounded-md\">\n<div class=\"flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md\">bash<span class=\"\" data-state=\"closed\"><button class=\"flex gap-1 items-center\">Copy code</button></span></div>\n<pre><code class=\"language-bash\">yarn add express ali-oss\n</code></pre>\n</div>\n<h4>步骤 2: 创建路由模块</h4>\n<p>在你的项目中创建一个新的路由模块,例如 <code>router_oss.js</code>,并在其中编写路由处理逻辑。我们将使用正则表达式来处理动态的文件下载请求。</p>\n<div class=\"dark bg-gray-950 rounded-md\">\n<div class=\"flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md\">javascript<span class=\"\" data-state=\"closed\"><button class=\"flex gap-1 items-center\">Copy code</button></span></div>\n<pre><code class=\"language-javascript\"><span class=\"hljs-comment\">// router_oss.js</span>\n\n<span class=\"hljs-keyword\">const</span> express = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'express'</span>);\n<span class=\"hljs-keyword\">const</span> router = express.<span class=\"hljs-title class_\">Router</span>();\n<span class=\"hljs-keyword\">const</span> <span class=\"hljs-variable constant_\">OSS</span> = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'ali-oss'</span>);\n\n<span class=\"hljs-comment\">// 创建 OSS 客户端实例</span>\n<span class=\"hljs-keyword\">const</span> client = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-title function_\">OSS</span>({\n <span class=\"hljs-attr\">region</span>: <span class=\"hljs-string\">'oss-cn-hangzhou'</span>,\n <span class=\"hljs-attr\">accessKeyId</span>: <span class=\"hljs-string\">'your_access_key_id'</span>,\n <span class=\"hljs-attr\">accessKeySecret</span>: <span class=\"hljs-string\">'your_access_key_secret'</span>,\n <span class=\"hljs-attr\">bucket</span>: <span class=\"hljs-string\">'your_bucket_name'</span>\n});\n\n<span class=\"hljs-comment\">// 处理文件下载请求</span>\nrouter.<span class=\"hljs-title function_\">get</span>(<span class=\"hljs-regexp\">/^\\/(.+)/</span>, <span class=\"hljs-keyword\">async</span> (req, res) =&gt; {\n <span class=\"hljs-keyword\">const</span> filename = req.<span class=\"hljs-property\">params</span>[<span class=\"hljs-number\">0</span>];\n\n <span class=\"hljs-keyword\">try</span> {\n <span class=\"hljs-comment\">// 生成文件下载链接</span>\n <span class=\"hljs-keyword\">const</span> result = <span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">signatureUrl</span>(filename, { <span class=\"hljs-attr\">expires</span>: <span class=\"hljs-number\">3600</span> });\n <span class=\"hljs-comment\">// 重定向到文件下载链接</span>\n res.<span class=\"hljs-title function_\">redirect</span>(result);\n } <span class=\"hljs-keyword\">catch</span> (err) {\n <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">error</span>(<span class=\"hljs-string\">'Error:'</span>, err);\n res.<span class=\"hljs-title function_\">status</span>(<span class=\"hljs-number\">500</span>).<span class=\"hljs-title function_\">send</span>(<span class=\"hljs-string\">'Internal Server Error'</span>);\n }\n});\n\n<span class=\"hljs-variable language_\">module</span>.<span class=\"hljs-property\">exports</span> = router;\n</code></pre>\n</div>\n<h4>步骤 3: 在主应用程序中使用路由模块</h4>\n<p>在你的主应用程序文件(例如 <code>app.js</code> 或 <code>index.js</code>)中,引入刚刚创建的路由模块,并将其挂载到适当的路径上。</p>\n<div class=\"dark bg-gray-950 rounded-md\">\n<div class=\"flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md\">javascript<span class=\"\" data-state=\"closed\"><button class=\"flex gap-1 items-center\">Copy code</button></span></div>\n<pre><code class=\"language-javascript\"><span class=\"hljs-comment\">// app.js 或 index.js</span>\n\n<span class=\"hljs-keyword\">const</span> express = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'express'</span>);\n<span class=\"hljs-keyword\">const</span> app = <span class=\"hljs-title function_\">express</span>();\n<span class=\"hljs-keyword\">const</span> routerOSS = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'./router_oss'</span>); <span class=\"hljs-comment\">// 替换成你的路由模块文件路径</span>\n\n<span class=\"hljs-comment\">// 将 OSS 路由挂载到根路径下</span>\napp.<span class=\"hljs-title function_\">use</span>(<span class=\"hljs-string\">'/'</span>, routerOSS);\n\n<span class=\"hljs-comment\">// 启动服务器</span>\n<span class=\"hljs-keyword\">const</span> port = <span class=\"hljs-number\">3000</span>; <span class=\"hljs-comment\">// 你想要监听的端口号</span>\napp.<span class=\"hljs-title function_\">listen</span>(port, <span class=\"hljs-function\">() =&gt;</span> {\n <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(<span class=\"hljs-string\">`Server is running on port <span class=\"hljs-subst\">${port}</span>`</span>);\n});\n</code></pre>\n</div>\n<h4>步骤 4: 测试</h4>\n<p>启动你的服务器,并在浏览器中访问 <code>http://localhost:3000/your_file_name</code>,将 <code>your_file_name</code> 替换为实际的文件名。如果一切正常,你应该能够重定向到相应的 OSS 文件下载链接。</p>\n<p>通过这个教程,你学会了如何使用 Express 和 ali-oss 模块创建一个动态文件下载路由,并通过正则表达式来实现灵活的路径匹配。这样,无论用户请求的文件是在哪个目录下,都可以正确生成对应的下载链接。</p>","status":0,"pv":295,"link":"","createdAt":"2024-04-11 20:08:03","updatedAt":"2025-05-22 10:44:23","field":{},"tags":[]}

article.tags------>[]

news------>[{"id":257,"title":"管理员操作手册:数据过滤规则配置","short_title":"","img":"","createdAt":"2024-12-26T10:31:59.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":256,"title":"书库后台改进计划文档","short_title":"","img":"","createdAt":"2024-12-20T09:17:33.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":255,"title":"数据库外键操作教程","short_title":"","img":"","createdAt":"2024-12-17T03:20:25.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":243,"title":"新加一下线上测试服务,用来测试新的版本","short_title":"","img":"","createdAt":"2024-07-02T08:30:27.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":235,"title":"我的棋局数据库设计","short_title":"","img":"","createdAt":"2024-06-17T01:25:17.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":218,"title":"解决 linux libstdc++版本的问题","short_title":"","img":"","createdAt":"2024-06-11T04:10:26.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":202,"title":"MongoDB的安装【转】","short_title":"","img":"","createdAt":"2024-05-02T05:26:33.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":174,"title":"使用Node.js从阿里云OSS下载文件的完整教程","short_title":"","img":"","createdAt":"2024-04-11T12:08:03.000Z","description":"","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":96,"title":"服务器最后的配置","short_title":"","img":null,"createdAt":"2023-11-08T09:50:12.000Z","description":"服务器手册","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":95,"title":"启动node js 项目","short_title":"","img":null,"createdAt":"2023-11-07T21:06:22.000Z","description":"当在服务器上初始化和启动项目时,通常需要遵循一系列步骤。以下是一个更正式的服务器手册,其中包括详细的指南,以确保成功完成这些任务。","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"}]

hot------>[{"id":218,"title":"解决 linux libstdc++版本的问题","path":"/cmsgaijin/houduan"},{"id":174,"title":"使用Node.js从阿里云OSS下载文件的完整教程","path":"/cmsgaijin/houduan"},{"id":20,"title":"cms系统的原始文件结构","path":"/cmsgaijin/houduan"},{"id":96,"title":"服务器最后的配置","path":"/cmsgaijin/houduan"},{"id":95,"title":"启动node js 项目","path":"/cmsgaijin/houduan"},{"id":88,"title":"MySQL 5.7 安装手册","path":"/cmsgaijin/houduan"},{"id":85,"title":"在阿里云服务器上安装Git手册","path":"/cmsgaijin/houduan"},{"id":16,"title":"footer文件的修改","path":"/cmsgaijin/houduan"},{"id":89,"title":"Mysql服务器配置文档","path":"/cmsgaijin/houduan"},{"id":15,"title":"原版cms一些不满意的地方","path":"/cmsgaijin/houduan"}]

imgs------>[{"id":62,"title":"如何在windows开机就运行python的应用","short_title":"","img":"/public/uploads/default/2023/10/11/1696986207007_mceclip0.png.png","createdAt":"2023-10-10T17:01:29.000Z","description":"在 Windows 上使 Python 应用在系统启动时自动运行的最常见方法是使用 Windows 任务计划程序(Task Scheduler)。你可以通过以下步骤来创建一个任务,以便在开机时自动运行你的 Python 应用:","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"},{"id":15,"title":"原版cms一些不满意的地方","short_title":"","img":"/public/uploads/default/2023/09/18/1695020024527_108_108.png.png","createdAt":"2023-09-18T06:18:16.000Z","description":"1 没有初始化","pinyin":"houduan","name":"后端","path":"/cmsgaijin/houduan"}]

pre------>{"id":96,"title":"服务器最后的配置","name":"后端","path":"/cmsgaijin/houduan"}

next------>{"id":202,"title":"MongoDB的安装【转】","name":"后端","path":"/cmsgaijin/houduan"}

E