项目图片 地址源切换

90 阅读1分钟

最近项目图片地址源切换,需要把地址从火山迁移到阿里,项目中那么多图片地址,为了省事,公司同事写了一个全局替换的脚本,觉得非常好,记录一下


const fs = require('fs')
const http = require("http");
var request = require('request')
const path = require('path')
var FormData = require('form-data');
const randomString = (e)=>  {
    e = e || 32;
    var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
        a = t.length,
        n = "";
    for (var i = 0; i < e; i++) {
        n += t.charAt(Math.floor(Math.random() * a))
    }
    return n + Date.now()
}
let getuplodOssUrl = (url) => {
    return new Promise((resolve) => {
        http.get(url.replace('https', 'http'), (response) => {
            const UrlObj = new URL(response.headers.location)
            let suffix = response.headers.location.slice(response.headers.location.lastIndexOf('.'), response.headers.location.length)
            const srcobjectname =response.headers.location.replace(new RegExp(UrlObj.origin + '/', 'g'), '')
            const dstobjectname = new Date().toLocaleDateString().replace(/\//g, '-').replace(/\d{1,}/g, ($0)=> $0.padStart(2,0)+ '').replace(/-/g, '') + "/" + randomString(32) + suffix
            request({
                url: '上传地址接口',
                method: "POST",
                // json: true,
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                form: {
                    "srcbucketname": "",
                    "srcobjectname": srcobjectname,
                    "dstobjectname": dstobjectname,
                    "destbucketname": ""
                }
            },function(error, response, body) {
                if (!error && response.statusCode == 200) {
                    let fileUrl = '新地址域名' + dstobjectname
                    request({
                        url: fileUrl,
                        method: "GET",
                    },function(error, response, body) {
                        if (!error && response.statusCode == 200) {
                            resolve(fileUrl + '?x-oss-process=image/quality,q_80/format,' + suffix.replace('.', ''))
                        } else {
                            resolve('')
                        }
                    })
                }
            })
        })
    })
}
let getReplaceRes = (files) => {
    return new Promise((resolve) => {
        let obj = {}
        let a3 = ''
        let i = 0
        files.replace(/https\:\/\/域名\/后缀\/\w{1,}/gi,($0,$1) => {
            obj[$0]= ''
            getuplodOssUrl($0).then(res => {
                obj[$0] = res
                a3 = files.replace(/https\:\/\/域名\/后缀\/\w{1,}/gi, ($0) => {
                    if(res) {
                        return obj[$0]
                    } else {
                        return $0
                    }
                })
                i++
                if(Object.values(obj).length === i) {
                    i=0
                    obj = {}
                    resolve(a3)
                }
            })
        })
    })
}
const a = async (sourcePath) => {
    const d = fs.statSync(sourcePath)
    if(d.isDirectory()) {
        let list = fs.readdirSync(sourcePath)
        list.forEach(item => {
            a(path.join(sourcePath, item))
        })
    } else {
        let files = fs.readFileSync(sourcePath, 'utf-8')
        let res = await getReplaceRes(files,sourcePath)
        fs.writeFileSync(sourcePath, res, 'utf-8')
    }
}
a(path.join(__dirname, '要替换的文件夹'))

把这个文件放在根目录下面 node 执行一下就可以啦