天天看点

[记录九]Vue+node+koa2+mysql+nginx+redis,全栈开发小程序和管理员管理系统项目——在服务器清除小程序上传的废弃图片

前言

首先,实现小程序上传与下载的逻辑我这里是这么实现的:小程序点击图片调服务器提供的api——服务器收到此请求获取图片文件的信息并读取和写入本地,比如写到项目的某个文件中去——然后在api中返回一个映射地址,此地址就是上传的图片的服务端项目的相对位置——小程序拿到地址直接显示,并在最终请求的时候已数组的形式发回给服务端——期间服务端会将小程序显示的图片地址对应的图片文件返回去。正常业务是这样的,但是小程序上传完图片,又不想要了(比如实际上传了5张,最终删掉两张,剩下三张),但是此时服务端已经写入了被小程序废弃的图片文件了,最终传到服务端的地址就是三张,服务器再将小程序给到的三个图片地址存表。

实现原理

遍历服务器本地的图片文件数组,将设为arr1——查询存储图片文件的表数据,假设为arr2,进行两两匹对,发现arr1中的数据并不在arr2,说明服务端本地存在图片文件,但是实际小程序上传的时候并没有传该图片的地址到服务端存表,说明这个图片是被小程序上传后废弃的,所以就在服务端删掉这个图片文件。考虑到需要定时去清理废弃的图片,这里采用定时任务去执行这个脚本。

代码

[记录九]Vue+node+koa2+mysql+nginx+redis,全栈开发小程序和管理员管理系统项目——在服务器清除小程序上传的废弃图片
// 每周一凌晨清除废弃的图片-(服务器本地的图片跟服务器存下的图片路径匹配)
 clearRubbishImg() {
   let server_path = []
   let data_sql=[]
   const filePath = path.join(__dirname, `../common/upload/img`) //图片文件地址
   fs.readdir(filePath,async(err,files)=>{ //读取文件里的图片地址
     if(err){
       console.warn(err)
     } else {
       console.log(files.length)
       let check_path_sql = `select img_path from img_address` //查询表中的图片地址
       let result_check_path_sql = await allServices.query(check_path_sql)
       result_check_path_sql.map(res => {
         let index = res.img_path.lastIndexOf("\/")
         let img_url = res.img_path.substring(index+1,res.img_path.length)
         data_sql.push(img_url)
       })
       for (let i = 0; i < files.length; i++) { 
         let flag=true //是否要删掉文件
         for (let j = 0; j < data_sql.length; j++) { 
           if (files[i] === data_sql[j]) { //说明files[i]图片地址是在数据表中的,是真正用到的图片
             flag = false
           }
         }
         if (flag) {
           console.log('我是要删除的文件')
           fs.unlinkSync(`${filePath}/${files[i]}`)
         }
       }
     }
   })
 }

           
[记录九]Vue+node+koa2+mysql+nginx+redis,全栈开发小程序和管理员管理系统项目——在服务器清除小程序上传的废弃图片

定时执行清理任务

const schedule = require('node-schedule')

// *  *  *  *  *  *
// ┬ ┬ ┬ ┬ ┬ ┬
// │ │ │ │ │  |
// │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
// │ │ │ │ └───── month (1 - 12)
// │ │ │ └────────── day of month (1 - 31)
// │ │ └─────────────── hour (0 - 23)
// │ └──────────────────── minute (0 - 59)
// └───────────────────────── second (0 - 59, OPTIONAL)

schedule.scheduleJob('0 1 1 * * 1', () => { //每周1凌晨1点1分执行清理任务
  script.clearRubbishImg()
})

           

上一篇:生成请求日志

下一篇:待写…

继续阅读