express 定时删除 oss 垃圾图片

一: 删除垃圾图片

思路:
  1. 获取 oss 中存储的所有图片文件;
  2. 获取数据库中存储的图片文件数据;
  3. 对比差异,不在数据库中的 oss 图片文件即为要删除的垃圾图片。
实现:

1、获取所有 oss 文件

import OSS from 'ali-oss'
import prisma from '@/services/index'import config from '@/config'
const { aliAccessKey, aliAccessKeySecret, ossBucketName, ossRegion } = configimport TaskOssScheduler from './schedule'const client = new OSS({region: ossRegion,accessKeyId: aliAccessKey,accessKeySecret: aliAccessKeySecret,bucket: ossBucketName
})/*** @description 获取 oss 下的图片* @param other * @returns */
export const getAllImgFromOss: any = async (other: any = {}) => {try {let continuationToken = null;let imgArray: string[] = []// 每页列举1000个文件。const maxKeys = '5';do {const result: any = await client.listV2({delimiter: '/',prefix: 'web/','start-after': 'web/', // web/ 目录之后的文件'continuation-token': continuationToken,'max-keys': maxKeys,...other}, {});continuationToken = result.nextContinuationToken;const { objects = [] } = resultfor (let i = 0; i < objects.length; i++) {imgArray.push(objects[i].name);}console.log(result);} while (continuationToken)return {list: imgArray,count: imgArray.length || 0,}} catch (error) {console.log(error);return []}
}

2、获取所有数据存储的图片数据

/*** 从数据库中获取图片*/
export const getAllImgFromModel = async () => {try {let dataBaseImgs: any = []// todo 未来查询多表const imgList = await prisma.applySitter.findMany({select: {idCardFrontUrl: true,idCardBackUrl: true,groomerImgUrl: true,manAndPetPhotoUrl: true,}})// 平铺返回值并替换路径域名部分imgList.map(item => {const items = Object.values(item).map(itemMap => itemMap?.replace('https://xxxx.com/', ''))dataBaseImgs.push(...items)})console.log(dataBaseImgs);return dataBaseImgs} catch (error) {return []}
}// 删除 oss 图片
export const delOssImgs = async (imgArr: string[]) => {try {const result = await client.deleteMulti(imgArr, { quiet: true });return result} catch (error) {throw error}
}

3、对比差异,找到要删除的图片

// 删除 oss 垃圾图片
export const delOssBadImgs = async () => {try {// 获取 oss 文件列表,// todo 暂时只获取 web 目录下图片// 1. oss 图片const ossResult = await getAllImgFromOss() || {}// 2. 存储到数据库图片const dataBaseResult = await getAllImgFromModel() || []// 3. 对比差异const badImgArr: string[] = []ossResult.list.forEach((arrItem: string) => {if (arrItem && !dataBaseResult.includes(arrItem)) {badImgArr.push(arrItem)}})// 4. 删除指定图片const delRes = await delOssImgs(badImgArr)// console.log('--->badImg');// console.log(badImgArr);if (delRes?.res.status === 200) {console.log('删除 oss 垃圾图片成功')} else {console.log('删除 oss 垃圾图片失败')}} catch (error) {}
}

二: 创建定时任务

1、安装依赖包 npm i node-schedule @types/node-schedule -S
node-schedule 为创建定时任务第三方库
2、创建定时任务基类文件 taskOssScheduler.ts

import schedule from 'node-schedule'
import dayjs from 'dayjs'
import type { Job, JobCallback } from 'node-schedule';// 定时任务基类
export default class TaskOssScheduler {cronExpression: string;task: JobCallback;job: Job | null;constructor(cronExpression: string, task: any) {this.cronExpression = cronExpressionthis.task = taskthis.job = null}// 启动任务start() {// 如果当前没有正在运行的任务,则创建新的任务if (!this.job) {this.job = schedule.scheduleJob(this.cronExpression, this.task);console.log(`定时任务启动: ${this.cronExpression}`);console.log(dayjs().format('YYYYMMDD-HH:mm:ss'));} else {this.stop()}}// 停止任务stop() {// 如果当前有正在运行的任务,则取消任务并将 job 设为 nullif (this.job) {this.job.cancel();console.log(`定时任务停止: ${this.cronExpression}`);console.log(dayjs().format('YYYYMMDD-HH:mm:ss'));this.job = null;}}
}

3、定义工具函数

// 每天的凌晨 2 点进行删除
// 入参任务开始时间及回调函数
export const DelOssImgTask = new TaskOssScheduler('0 0 2 * * *', delOssBadImgs)

4、定义 express 路由,通过访问路由,开启和关闭定时任务
ossController:

  startDelOssImgTask: async (req: Request, res: Response) => {try {// 开启定时删除 oss 垃圾图片任务DelOssImgTask.start()res.send(ComResult.success('定时任务开启'))} catch (error) {throw error}},stopDelOssImgTask: async (req: Request, res: Response) => {try {// 关闭定时删除 oss 垃圾图片任务DelOssImgTask.stop()res.send(ComResult.success('定时任务关闭'))} catch (error) {throw error}}

ossRoutes:

ossRoutes.post('/startDelOssImgTask', ossController.startDelOssImgTask)
ossRoutes.post('/stopDelOssImgTask', ossController.stopDelOssImgTask)

三、测试

在这里插入图片描述
oss 删除结果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端秘法基础式(HTML)(第二卷)

目录 一.表单标签 1.表单域 2.表单控件 2.1input标签 2.2label/select/textarea标签 2.3无语义标签 三.特殊字符 一.表单标签 用来完成与用户的交互,例如登录系统 1.表单域 <form>通过action属性,将用户填写的数据转交给服务器 2.表单控件 2.1input标签 type…

【Python网络编程之Ping命令的实现】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之Ping命令的实现 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2…

Linux之多线程

目录 一、进程与线程 1.1 进程的概念 1.2 线程的概念 1.3 线程的优点 1.4 线程的缺点 1.5 线程异常 1.6 线程用途 二、线程控制 2.1 POSIX线程库 2.2 创建一个新的线程 2.3 线程ID及进程地址空间布局 2.4 线程终止 2.5 线程等待 2.6 线程分离 一、进程与线程 在…

数模.传染病模型plus

一、SIS模型 二、SIR模型 三、SIRS模型 四、SEIR模型

机器学习---规则学习(序贯覆盖、单条规则学习、剪枝优化)

1. 序贯覆盖 回归&#xff1a; 分类&#xff1a; 聚类&#xff1a; 逻辑规则&#xff1a; 读作&#xff1a;若&#xff08;文字1且文字2且...&#xff09;&#xff0c;则目标概念成立 规则集&#xff1a;充分性与必要性&#xff1b;冲突消解&#xff1a;顺序规则、缺省规则…

嵌入式Linux系统中的设备驱动开发:从设备树到驱动实现

大家好&#xff0c;今天给大家介绍嵌入式Linux系统中的设备驱动开发&#xff1a;从设备树到驱动实现&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在嵌入式Linux系统中&#x…

Java网络编程 双向通信

目录 网络编程实例创建客户端创建服务端测试 网络编程 Java的网络编程是Java编程语言中用于实现网络通信的一组API和工具。通过Java的网络编程&#xff0c;开发人员可以在Java应用程序中实现客户端和服务器之间的通信&#xff0c;从而构建各种网络应用。 以下是Java网络编程的…

react【六】 React-Router 路由

文章目录 1、Router1.1 路由1.2 认识React-Router1.3 Link和NavLink1.4 Navigate1.5 Not Found页面配置1.6 路由的嵌套1.7 手动路由的跳转1.7.1 在函数式组件中使用hook1.7.2 在类组件中封装高阶组件 1.8 动态路由传递参数1.9 路由的配置文件以及懒加载 1、Router 1.1 路由 1.…

Uipath 调用Python 脚本程序详解

Python 活动概述 UiPath.Python.Activities 是一个新的活动包&#xff0c;创建它是为了支持直接从工作流运行 Python 脚本和方法。 其包含以下活动&#xff1a; Python 作用域(Python Scope) - 为 Python 活动提供作用域的容器。 加载 Python 脚本(Load Python Script) - 将 P…

深入了解pip和conda:高效Python环境管理的必备指南

pip相关命令: 更新包之前最好更新一下pip&#xff0c;因为更新其他包底层是依赖 pip pip show pippython -m pip install --upgrade pippython更新包&#xff1a; - ​ pip install --upgrade 包 pip install pandas- ​ pip install --upgrade 包名称版本号查看那些包需要更…

Kubernetes安装部署 2

Kubeadm创建集群 如上所示&#xff0c;在阿里云的香港地域的ECS服务器上拉取下载Kubernetes官方提供的容器镜像 如上所示&#xff0c;在阿里云的香港地域的ECS服务器保存镜像到本地 Node A服务器的IP地址&#xff1a;192.168.0.130 端口号6443开放、部署Docker容器引擎、支持cr…

clang前端

Clang可以处理C、C和Objective-C源代码 Clang简介 Clang可能指三种不同的实体&#xff1a; 前端&#xff08;在Clang库中实现&#xff09;编译驱动程序&#xff08;在clang命令和Clang驱动程序库中实现&#xff09;实际的编译器&#xff08;在clang-ccl命令中实现&#xff0…