最近项目图片地址源切换,需要把地址从火山迁移到阿里,项目中那么多图片地址,为了省事,公司同事写了一个全局替换的脚本,觉得非常好,记录一下
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 执行一下就可以啦