场景-文件下载

163 阅读1分钟

示例:

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;

使用

工作原理

  1. 原始链接是普通的文件下载链接 /res/hill.zip

  2. JavaScript会将其转换为迅雷专用下载链接:

    • 添加AA和ZZ包裹原始URL → AA/res/hill.zipZZ
    • 进行Base64编码
    • 添加thunder://协议头
<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>