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地址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> </body> </html>
断点续传 下载的原理
关键是在于