NodeJS 文件操作封装 ②①

news2024/11/28 22:51:10

文章目录

  • 前言
  • 导入模块
  • 创建文件
  • 递归删除文件&文件夹
  • 下载写入图片
  • 根据URL路劲返回Base64图片链接
  • 根据URL路劲异步返回Base64图片链接
  • 封装代码暴露模块
  • 总结


                    ⡖⠒⠒⠒⠤⢄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸   ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
⠀⠙⣌⠳⣄⠀⡇   不能   ⡏⠀⠀  ⠈⠳⡌⣦⠀⠀⠀⠀
⠀⠀⠈⢳⣈⣻⡇   白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽   

前言

  1. Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与```PHP、Java、Python、.NET、Ruby等后端语言平起平坐。
  2. Nodejs是基于V8引擎,V8是Google发布的开源JavaScript引擎,本身就是用于Chrome浏览器的JS解释,但是Node之父 Ryan Dahl在这里插入图片描述把这V8搬到了服务器上,用于做服务器的软件。

导入模块

const fs = require("fs");
const path = require('path')
const http = require('http')
const request = require('request')

创建文件

// 创建文件
function createDir (createPath) => {
        const savePath = path.join(__dirname, `/${createPath}`)
        return new Promise(resolve => {
            fs.mkdir(savePath, (err) => {
                if (err && err.code === "EEXIST") {
                    console.log("目录已经存在...")
                    resolve(true);
                } else {
                    console.log("目录创建成功...")
                }
            })
        })
    },

递归删除文件&文件夹

// 删除文件
function deleteFile(deletePath) {
    const savePath = deletePath
    return new Promise(resolve => {
        try {
            let fileDirs = [];
            // 同步检查给定路径中是​​否已存在文件
            if (fs.existsSync(savePath)) {
                // 是否是文件夹
                if (fs.statSync(savePath).isDirectory()) {
                    // 同步读取给定目录的内容。该方法返回一个数组
                    fileDirs = fs.readdirSync(savePath);
                    fileDirs.forEach(fileName => {
                        const temPath = `${savePath}/${fileName}`
                        //异步返回有关给定文件路径的信息。返回的fs.Stat对象具有多个字段和方法,以获取有关文件的更多详细信息。
                        if (fs.statSync(temPath).isDirectory()) {
                            deleteFile(temPath); // 递归删除目录
                        } else {
                            // fs.unlinkSync(temPath); //删除文件
                            fs.rmSync(temPath); //从文件系统中同步删除文件或符号链接
                        }
                    })
                    fs.rmdirSync(savePath); //删除目录
                } else {
                    //异步返回有关给定文件路径的信息。返回的fs.Stat对象具有多个字段和方法,以获取有关文件的更多详细信息。
                    fs.rmSync(savePath) //给定路径下同步删除文件
                }
            }
            resolve('删除文件成功!');
        } catch {
            resolve('删除文件失败!');
        }
    })
}

下载写入图片

// 下载写入图片
function downAndSaveImages (imageUrl, savePath, callback)  {
    let fileName;
    if (imageUrl !== null && imageUrl.trim() !== '') {
        fileName = imageUrl?.split("/").pop();
    } else {
        fileName = 'https://img10.360buyimg.com/n7/jfs/t1/171353/9/37342/60961/6444f803F94c1aeb3/1babdae3121fdbac.jpg'.split("/").pop();
    }
    const savePath1 = path.join(__dirname, `/${savePath}`)
    const process = fs.createWriteStream(savePath1 + `/${fileName}`);

    request({
        url: (imageUrl !== null && imageUrl.trim() !== '') ? imageUrl : 'https://img10.360buyimg.com/n7/jfs/t1/171353/9/37342/60961/6444f803F94c1aeb3/1babdae3121fdbac.jpg',
        timeout: 5000
    }).pipe(process);

    process.on("finish", () => {
        callback?.(`${fileName} 下载成功~`)
        // console.log(`${fileName} 下载成功~`);
        process.close()
    });
    process.on("error", err => {
        callback?.(`${fileName} 下载失败~`, new Error('❌'))
    });
}

根据URL路劲返回Base64图片链接

//#region 返回Base64数据
imgToBase64: (imageUrl, callback) => {
    http.get(imageUrl, function (res) {
        let chunks = [];
        let size = 0;
        res.on('data', function (chunk) {
            chunks.push(chunk);
            size += chunk.length;  //累加缓冲数据的长度
        });
        res.on('end', function (err) {
            let data = Buffer.concat(chunks, size);
            let base64Img = data.toString('base64');
            let images = `data:image/png;base64,${base64Img}`
            callback(`转换成功,data:image/png;base64......`)
            return base64Img
        });
    });
},
//#endregion

根据URL路劲异步返回Base64图片链接

function ImgToBase64Async(imageUrl, callback) {
    return new Promise(function (resolve, reject) {
        const url = (imageUrl !== null && imageUrl.trim() !== '' && imageUrl.length >= 20) ? imageUrl : 'http://img10.360buyimg.com/n7/jfs/t1/171353/9/37342/60961/6444f803F94c1aeb3/1babdae3121fdbac.jpg'
        try {
            http.get(url, function (res) {
                let chunks = [];
                let size = 0;
                res.on('data', function (chunk) {
                    chunks.push(chunk);
                    size += chunk.length;  //累加缓冲数据的长度
                });
                res.on('end', function (err) {
                    let data = Buffer.concat(chunks, size);
                    let base64Img = data.toString('base64');
                    let images = `data:image/png;base64,${base64Img}`
                    resolve({success: true, data: images});
                    callback(`转换成功,data:image/png;base64......`)
                });
            });
        } catch (e) {
            throw new Error('错误❌!')
        }
    })
}

封装代码暴露模块

const fs = require("fs");
const path = require('path')
const http = require('http')
const request = require('request')

const DownFileController = {
    // 创建文件
    createDir: (createPath) => {
        const savePath = path.join(__dirname, `/${createPath}`)
        return new Promise(resolve => {
            fs.mkdir(savePath, (err) => {
                if (err && err.code === "EEXIST") {
                    console.log("目录已经存在...")
                    resolve(true);
                } else {
                    console.log("目录创建成功...")
                }
            })
        })
    },
	// 递归删除文件 文件夹
	deleteFile: (deletePath) => {
	    const savePath = deletePath
	    return new Promise(resolve => {
	        try {
	            let fileDirs = [];
	            // 同步检查给定路径中是​​否已存在文件
	            if (fs.existsSync(savePath)) {
	                if (fs.statSync(path).isDirectory()) {
	                    // 同步读取给定目录的内容。该方法返回一个数组
	                    fileDirs = fs.readdirSync(savePath);
	                    fileDirs.forEach(fileName => {
	                        const temPath = `${savePath}/${fileName}`
	                        //异步返回有关给定文件路径的信息。返回的fs.Stat对象具有多个字段和方法,以获取有关文件的更多详细信息。
	                        if (fs.statSync(temPath).isDirectory()) {
	                            DownFileController.deleteDir(temPath); // 递归删除目录
	                        } else {
	                            // fs.unlinkSync(temPath); //删除文件
	                            fs.rmSync(temPath); //从文件系统中同步删除文件或符号链接
	                        }
	                    })
	                    fs.rmdirSync(savePath); //删除目录
	                } else {
	                    //异步返回有关给定文件路径的信息。返回的fs.Stat对象具有多个字段和方法,以获取有关文件的更多详细信息。
	                    fs.rmSync(savePath) //给定路径下同步删除文件
	                }
	            }
	            resolve('删除文件成功!');
	        } catch {
	            resolve('删除文件失败!');
	        }
	    })
	},
   // 下载写入图片
   downAndSaveImages: (imageUrl, savePath, callback) => {
       let fileName;
       if (imageUrl !== null && imageUrl.trim() !== '') {
           fileName = imageUrl?.split("/").pop();
       } else {
           fileName = 'https://img10.360buyimg.com/n7/jfs/t1/171353/9/37342/60961/6444f803F94c1aeb3/1babdae3121fdbac.jpg'.split("/").pop();
       }
       const savePath1 = path.join(__dirname, `/${savePath}`)
       const process = fs.createWriteStream(savePath1 + `/${fileName}`);

       request({
           url: (imageUrl !== null && imageUrl.trim() !== '') ? imageUrl : 'https://img10.360buyimg.com/n7/jfs/t1/171353/9/37342/60961/6444f803F94c1aeb3/1babdae3121fdbac.jpg',
           timeout: 5000
       }).pipe(process);

       process.on("finish", () => {
           callback?.(`${fileName} 下载成功~`)
           process.close()
       });
       process.on("error", err => {
           callback?.(`${fileName} 下载失败~`, new Error(err))
       });
   },
   //#region 返回Base64数据
   imgToBase64: (imageUrl, callback) => {
       http.get(imageUrl, function (res) {
           let chunks = [];
           let size = 0;
           res.on('data', function (chunk) {
               chunks.push(chunk);
               size += chunk.length;  //累加缓冲数据的长度
           });
           res.on('end', function (err) {
               let data = Buffer.concat(chunks, size);
               let base64Img = data.toString('base64');
               let images = `data:image/png;base64,${base64Img}`
               callback(`转换成功,data:image/png;base64......`)
               return base64Img
           });
       });
   },
   imgToBase64Async: (imageUrl, callback) => {
       return new Promise(function (resolve, reject) {
           const url = (imageUrl !== null && imageUrl.trim() !== '' && imageUrl.length >= 20) ? imageUrl : 'http://img10.360buyimg.com/n7/jfs/t1/171353/9/37342/60961/6444f803F94c1aeb3/1babdae3121fdbac.jpg'
           try {
               http.get(url, function (res) {
                   let chunks = [];
                   let size = 0;
                   res.on('data', function (chunk) {
                       chunks.push(chunk);
                       size += chunk.length;  //累加缓冲数据的长度
                   });
                   res.on('end', function (err) {
                       let data = Buffer.concat(chunks, size);
                       let base64Img = data.toString('base64');
                       let images = `data:image/png;base64,${base64Img}`
                       resolve({success: true, data: images});
                       callback(`转换成功,data:image/png;base64......`)
                   });
               });
           } catch (e) {
               throw new Error('错误❌!')
           }
       })
   }
   //#endregion
}

module.exports = DownFileController

总结

以上是个人学习Node的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java爬虫】使用selenium获取某宝联盟淘口令

上一篇文章我们已经介绍过使用selenium获取优惠券基本信息的方法 (15条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 本文将在上一篇文章的基础上更进一步,获取每个优惠券的淘口令,毕竟我们只有复制淘口令才能在APP里面获取优惠…

Appium python 框架

目录 前言 流程 结构 具体说说 run.py 思路 其他模块 前言 Appium是一个开源的移动应用自动化测试框架,它允许开发人员使用多种编程语言(包括Python)来编写自动化测试脚本。Appium框架提供了一套API和工具,可以与移动设备进…

C语言——指针详解(初阶)

轻松学会C语言指针 前言:一、指针是什么?1.1 指针是什么?1.2 指针变量1.3 总结 二、指针和指针类型2.1指针-整数2.2 指针的解引用 三、野指针3.1野指针的成因3.2如何避免野指针 四、指针运算4.1 指针-整数4.2指针-指针4.3指针的关系运算 五、…

【学会动态规划】不同路径(5)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

Delete `␍`eslint(prettier/prettier)报错的终极解决方案

1.背景 在进行代码仓库clone打开后,vscode报错全屏的 Delete ␍eslint(prettier/prettier)问题 2. 解决方案: 1.vscode直接转化 好处:直接转化当前页面的报错 坏处:每个界面都需要来一遍 2.设置git配置 好处:一…

竞赛信息管理系统——SSM

目录 一、项目简介 二、前置配置 1、创建数据库 2、编写application.yml文件 三、公共基础类 1、自定义登录拦截器类 2、自定义拦截规则 3、统一数据返回类 4、统一异常处理类 5、工具类 a、密码工具类 b、时间工具类 6、全局变量 四、用户模块 1、定义…

echarts环形图两层

1、实现效果 环形图&#xff0c;有两层环形&#xff0c;扇形之间有间隔&#xff0c;中间是标题&#xff0c;图例是自定义图片 2、实现 在template里写一个盒子放图表 <div class"chartMachineStyle" ref"chartMachine"></div>在style里设置盒…

状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

从今天起&#xff0c;我们开始学习状态模式。在实际的软件开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上来看&#xff0c;它有点像我们之前讲到的组合模式。 可以简短的回顾一下组合模式&#xff1a…

Windows cmd窗口下的代码页

查看当前的活动代码页 在cmd窗口下执行命令chcp可以查看当前的活动代码页&#xff1a; 临时修改活动代码页 在cmd窗口下执行命令chcp [nnn]&#xff0c;可以临时修改活动代码页&#xff08;窗口关闭后修改就失效了&#xff09;&#xff0c;其中[nnn]表示具体的代码页标识符…

Java 中的反射是什么?如何使用它?

Java 中的反射是什么&#xff1f;如何使用它&#xff1f; 在 Java 编程中&#xff0c;反射是一种高级的编程技术&#xff0c;可以在运行时动态地获取和操作类的信息。反射使得程序可以在运行时对类进行检查和操作&#xff0c;而不需要在编译时知道类的完整信息。这使得程序可以…

flstudio怎么保存工程文件?详解FL Studio 21保存文件的方法

FL Studio 21全称Fruity Loops Studio2023&#xff0c;这款软件也被人们亲切的称之为水果&#xff0c;它是一款功能强大的音乐创作编辑软件&#xff0c;拥有全功能的录音室&#xff0c;大混音盘以及先进的音乐制作工具&#xff0c;用户通过使用该软件&#xff0c;就可以轻松制作…

Ubuntu下搭建Redis分片集群

目录 准备实例和配置 启动分片集群 测试分片集群 分片集群需要的节点数量较多&#xff0c;搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;并且master之间通过心跳机制互相监听&#xff0c;此模式下不需要哨兵监听…

js高级进阶:promise同步编程技巧

promise是ES6引进的异步编程解决方案&#xff0c;是一个构造函数&#xff0c;可以实例化对象&#xff0c;可以解决回调地狱的问题。 首先我们看一下promise的实例化对象是什么&#xff1a; let P new Promise(function(){});//new一个promise传入一个函数console.log(P);打印结…

读发布!设计与部署稳定的分布式系统(第2版)笔记23_互联层之DNS

1. 互连层是可以真正构建高可用性的地方 1.1. 流量管理 1.2. 负载均衡 1.3. 服务发现 2. 不同规模的解决方案 2.1. 在小公司中 2.1.1. 只有少数开发人员的小企业可以直接使用DNS条目 2.1.2. 生成变更的开发人员较少&#xff0c;变更频度变低 2.1.3. 可能根本就没有独立…

高阶C语言|指针的进阶

指针的主题&#xff0c;在指针初阶阶段&#xff0c;我们知道了指针的概念&#xff1a; 1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2.指针的大小是固定4/8个字节&#xff08;32为平台/64位平台&#xff09;。 3.指针是有类型&#xff0c…

java+springboot基于云的学习笔记系统设计与开发 _44va6

学习笔记系统按照权限的类型进行划分&#xff0c;分为管理员和用户共两个模块。系统实现登录、个人信息修改&#xff0c;还可以对个人中心&#xff0c;用户管理&#xff0c;笔记本管理&#xff0c;笔记分享管理&#xff0c;分享类型管理&#xff0c;学习资料管理&#xff0c;购…

Makefile:10分钟带你了解makefile

1、Makefile是什么 在Linux系统中&#xff0c;Makefile是一个脚本文件&#xff0c;通常名为Makefile或者makefile&#xff0c;它使得程序员能够快速便捷地完成调用程序、编译代码、定位故障等工作。 Makefile是一个用于自动化构建和编译程序的脚本文件。它包含了程序的所有源…

Ubuntu下配置Redis哨兵集群

目录 准备实例和配置 启动哨兵集群 测试配置 搭建一个三节点形成的Sentinel集群&#xff0c;来监管Redis主从集群。 三个sentinel哨兵实例信息如下&#xff1a; 节点IPPORTs1192.168.22.13527001s2192.168.22.13527002s3192.168.22.13527003 准备实例和配置 要在同一台虚…

01. Docker基础环境构建

目录 1、前言 2、关于Docker 2.1、几个术语 2.2、Docker容器化的价值 3、搭建基础环境 3.1、安装VMware 3.2、安装Doker 3.3、启动 3.4、验证Docker环境 4、小结 1、前言 在这里我们将学习关于Docker的一些技能知识&#xff0c;那么首先我们应该怼Docker有一个基础的…

服务器离线部署docker,镜像迁移,mysql主从搭建等服务

公司项目要上线项目&#xff0c;买了两台云服务器&#xff0c;需进行环境部署&#xff08;1台接入公网&#xff0c;一台只能局域网访问&#xff09;&#xff0c;主要部署以下内容 1、服务器之间配置ssh免密 2、离线docker部署 3、docker镜像迁移 4、redis服务 5、minio文件…