node实现文件下载
方法一:
const express = require('express');
const router = express.Router();
const fs = require('fs');
const path = require('path');
const {errorMsg} = require("../../util/apiUtils");router.get('/:fileName', async (req, res) => {const filePath = path.resolve(__dirname, `./../../public/upload/${req.params.fileName}`)const fileExit = exitsFile(filePath);if (fileExit) {res.download(filePath, req.params.fileName);} else {errorMsg('文件不存在');}
})/*** 判断文件是否存在* @param absPath 文件的路径* @returns {Promise<*>}*/
async function exitsFile(absPath) {const stats = await fs.statSync(absPath);return stats.isFile()
}module.exports = router;
方法二
const express = require('express');
const router = express.Router();
const fs = require('fs');
const path = require('path');
const {errorMsg} = require("../../util/apiUtils");router.get('/:fileName', async (req, res) => {const filePath = path.resolve(__dirname, `./../../public/upload/${req.params.fileName}`)const fileExit = exitsFile(filePath);if (fileExit) {fs.readFile(filePath,(err, data) => {res.send(data);res.end();});} else {errorMsg('文件不存在');}
})/*** 判断文件是否存在* @param absPath 文件的路径* @returns {Promise<*>}*/
async function exitsFile(absPath) {const stats = await fs.statSync(absPath);return stats.isFile()
}module.exports = router;
效果:
如果是错误的文件路径如下:
如果是正确的文件路径可以直接打开下载的弹框。
前端可以直接实现迅雷下载
原理
前提是你本地要安装了迅雷才会打开迅雷下载。
迅雷下载协议
把完整的下载地址得到
AA地址ZZ
base64编码 使用自带的方法btoa()
thunder://base64编码
完整案列如下:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><a resrole="thunder" href="/api/download/1608966035138-6mgmkl.jpg">下载</a><!-- 迅雷下载协议把完整的下载地址得到AA地址ZZbase64编码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></body>
</html>
断点续传 下载的原理
关键是在于