node 实现文件下载,web打开迅雷下载文件

简介: node 实现文件下载,web打开迅雷下载文件

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;


效果:

如果是错误的文件路径如下:


20201226162505620.png


如果是正确的文件路径可以直接打开下载的弹框。


前端可以直接实现迅雷下载


原理


前提是你本地要安装了迅雷才会打开迅雷下载。


迅雷下载协议

把完整的下载地址得到

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>


断点续传 下载的原理


关键是在于


20201226163012674.png

相关文章
|
2月前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用
|
14天前
|
JavaScript
使用Node.js创建一个简单的Web服务器
使用Node.js创建一个简单的Web服务器
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
35 4
|
2月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
2月前
|
JavaScript 算法 内存技术
如何降低node.js版本(nvm下载安装与使用)
如何降低node.js版本(nvm下载安装与使用)
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的深度整合
【9月更文挑战第28天】在现代Web开发领域,Node.js和Express框架的结合已成为打造高性能、易扩展应用的黄金组合。本文将深入探讨如何利用这一技术栈优化Web应用架构,提供具体实践指导,并分析其性能提升的内在机制。通过代码示例,我们将展示从基础搭建到高级功能的实现过程,旨在为开发者提供一条清晰的学习路径,以实现技术升级和项目效率的双重提升。
54 3
|
2月前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
33 0
|
2月前
|
JavaScript 前端开发 应用服务中间件
Node.js Web 模块
Node.js Web 模块
|
3月前
|
JSON JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的完美结合
【9月更文挑战第28天】在现代Web开发中,Node.js和Express框架的结合为创建高性能、易扩展的应用提供了强有力的支持。本文将深入探讨如何利用这两种技术构建一个简单但功能强大的Web服务,同时提供代码示例以加深理解。
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
143 3