定时获取远程文件并存储更新记录
这类似一个备份功能, 只会保存更新, 比如后端的接口文档经常变, 然后可以用此工具来保存更新记录.
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' })
}