• 定时获取远程文件并存储更新记录


    定时获取远程文件并存储更新记录

    这类似一个备份功能, 只会保存更新, 比如后端的接口文档经常变, 然后可以用此工具来保存更新记录.

    new Promise(async () => {
      setInterval(() => {
        // const fileUrl = `http://172.16.203.82:8203/v3/api-docs`
        const fileUrl = `http://127.0.0.1:9070/file`
        backUrl(fileUrl)
      }, 1000)
    })
    
    async function backUrl(fileUrl) {
      const { data: fileData, ext: fileExt } = await getFile(fileUrl)
      const {
        pathname,
        fileName,
      } = getFilePath(fileUrl)
      console.log(`getFilePathRes`, `${pathname}/${fileName}`)
      const fs = require('fs')
      const dir = `${__dirname}/${pathname}`
      fs.mkdirSync(dir, { recursive: true })
      console.log(`dirdir`, dir)
      const maxTime = fs.readdirSync(dir).filter(item => { // 获取所有备份的文件
        return item.match(/_d{13}_back/)
      }).map(item => { // 获取所有时间戳
        return Number(item.match(/(d{13})/)[1])
      }).sort().reverse()[0] // 获取最大的那个时间戳
      console.log(`maxTime`, maxTime)
      if (maxTime) {
        const oldMd5 = getFileMd5(fs.readFileSync(`${dir}/${fileName}_${maxTime}_back.${fileExt}`))
        const tempFile = `${dir}/temp`
        saveFile(tempFile, fileData)
        const newMd5 = getFileMd5(fs.readFileSync(tempFile))
        fs.unlinkSync(tempFile)
        console.log({ oldMd5, newMd5 })
        if (oldMd5 !== newMd5) {
          saveFile(`${dir}/${fileName}_${Date.now()}_back.${fileExt}`, fileData)
        }
      } else {
        saveFile(`${dir}/${fileName}_${Date.now()}_back.${fileExt}`, fileData)
      }
    }
    
    
    function getFileMd5(pathOrBuffer, type) { // 获取文件 md5
      const fs = require(`fs`)
      const buffer = type === `path` ? fs.readFileSync(pathOrBuffer) : pathOrBuffer
      const crypto = require('crypto');
      const md5 = crypto.createHash('md5').update(buffer).digest('hex')
      return md5
    }
    
    // 获取文件的存储路径
    function getFilePath(url) {
      const filenamify = require('filenamify')
      const {
        pathname,
        origin,
      } = new URL(url)
      const fileName = filenamify(
        url.replace(origin + pathname, ``),
        { maxLength: 255, replacement: '_' }
      )
      return {
        pathname,
        fileName,
      }
    }
    
    // 请求文件
    function getFile(url) {
      return new Promise((resolve, reject) => {
        const http = require(`http`)
        http.get(url, res => {
          const { statusCode } = res
          if (statusCode !== 200) {
            reject(statusCode)
          }
          let data = ''
          res.setEncoding('binary')
          res.on('data', (chunk) => {
            data += chunk
          });
          res.on('end', () => {
            const mime = require('mime')
            const ext = mime.getExtension(res.headers[`content-type`]) || ``
            resolve({
              data,
              ext,
            })
          })
        })
      })
    }
    
    // 保存文件,目录是 url 路径,名称是请求的返回结果时间 【yyyy-mm-dd hh-MM-ss.后缀名】
    function saveFile(filePath, bin) {
      const fs = require('fs')
      fs.writeFileSync(filePath, bin, { encoding: 'binary' })
    }
    
    
    
    
  • 相关阅读:
    最短路径问题
    这是我的第一篇博客
    Time Series Anomaly Detection
    R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN
    database 学习
    AWS Cloud Practioner 官方课程笔记
    Cassandra commands
    go 语言学习
    [Udemy] ES 7 and Elastic Stack
    第9章 内联函数
  • 原文地址:https://www.cnblogs.com/daysme/p/14719543.html
Copyright © 2020-2023  润新知