示例:
const express = require("express");
const path = require("path");
const router = express.Router();
router.get("/:filename", (req, res) => {
const absPath = path.resolve(
__dirname,
"../../resources",
req.params.filename
);
// 添加安全检查
const safeFilename = path.normalize(req.params.filename).replace(/^(\.\.(\/|\\|$))+/, '');
const finalPath = path.join(__dirname, "../../resources", safeFilename);
// 验证文件是否存在
if (!fs.existsSync(finalPath)) {
return res.status(404).send("File not found");
}
res.download(finalPath, req.params.filename, (err) => {
if (err) {
console.error("Download error:", err);
if (!res.headersSent) {
res.status(500).send("Download failed");
}
}
});
});
module.exports = router;
使用:
工作原理
-
原始链接是普通的文件下载链接
/res/hill.zip -
JavaScript会将其转换为迅雷专用下载链接:
- 添加AA和ZZ包裹原始URL →
AA/res/hill.zipZZ - 进行Base64编码
- 添加
thunder://协议头
- 添加AA和ZZ包裹原始URL →
<a resrole="thunder" href="/res/hill.zip">下载</a>
<!-- 迅雷下载协议
把完整的下载地址得到
AA地址ZZ
base64编码
thunder://base64编码
<script>
const a = document.querySelector("a[resrole=thunder]");
let thunderLink = `AA${a.href}ZZ`;
thunderLink = btoa(thunderLink);
thunderLink = "thunder://" + thunderLink;
a.href = thunderLink;
</script>