业务背景
有同学在页面录制视频时,将生产地址写成了测试环境,导致大量生产数据跑进测试环境,领导大发雷霆,而我临危受命。
解决方案
1.创建springboot工程
2.读取测试环境的亚马逊S3存储服务器的zip
3.修改zip里面的域名为生产环境
4.压缩zip上传至生产S3存储服务器
代码实现
1.连接S3存储服务器
/**
* @Author nasus
* @Date 2021/2/1
* @Description
*/
@Component
@Slf4j
public class OssConn {
public AmazonS3 conn(String accessKey,String secretKey,String endpoint){
AmazonS3 amazonClient = null;
try{
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
amazonClient = new AmazonS3Client(credentials, clientConfig);
amazonClient.setEndpoint(endpoint);
amazonClient.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).disableChunkedEncoding().build());
log.info("OSS-AmazonClient初始化:{}成功",endpoint);
}catch (Exception e){
e.getMessage();
log.error("OSS-AmazonClient初始化失败",e);
System.exit(0);
}
return amazonClient;
}
}
2.建立与S3存储服务器连接读取压缩
private Boolean readZipModifyText(String bizId, String id, String filePath, String fileName) {
if (null == uatS3)
uatS3 = ossConn.conn(uatAccessKey, uatSecretKey, uatEndpoint);
if (null == prdS3)
prdS3 = ossConn.conn(prdAccessKey, prdSecretKey, prdEndpoint);
String zipText = "";
ZipFile zipFile = null;
try {
S3Object object = uatS3.getObject(uatBucketName, filePath);
BufferedInputStream inputStream = new BufferedInputStream(object.getObjectContent());
//将InputStream对象转换成ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > -1 ) {
byteArrayOutputStream.write(buffer, 0, len);
}
byteArrayOutputStream.flush();
//将byteArrayOutputStream可转换成多个InputStream对象,达到多次读取InputStream效果
InputStream inputStreamA = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
InputStream inputStreamB = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
inputStream.close();
byteArrayOutputStream.close();
//创建本地文件
File file = new File(fileName);
boolean newFile = file.createNewFile();
if (!newFile) {
log.error("id为:{}文件缓存本地失败", id);
return false;
}
//读取出zip文件中的txt文本
OutputStream outputStream = new FileOutputStream(file);
int len2 = 0;
byte[] buffer2 = new byte[8192];
while ((len2 = inputStreamA.read(buffer2)) != -1) {
outputStream.write(buffer2, 0, len2);
}
outputStream.close();
inputStreamA.close();
zipFile = new ZipFile(file);
Charset gbk = Charset.forName("utf-8");
ZipInputStream zin = new ZipInputStream(inputStreamB, gbk);
inputStreamB.close();
ZipEntry ze;
while ((ze = zin.getNextEntry()) != null) {
if (ze.isDirectory()) {
} else {
System.err.println("file - " + ze.getName() + " : "
+ ze.getSize() + " bytes");
long size = ze.getSize();
if (size > 0) {
BufferedReader br = new BufferedReader(
new InputStreamReader(zipFile.getInputStream(ze)));
String line;
while ((line = br.readLine()) != null) {
//拿到zip中的txt内容
zipText = line;
//System.out.println(line);
}
br.close();
}
}
zin.closeEntry();
}
zin.close();
zipFile.close();
System.gc();
Thread.sleep(100);
//拿到txt文本内容后删除zip文件
this.deleteFile(file);
//替换txt中的文字
zipText = zipText.replace("uatxxxx.com", "prdxxxx.com");
//创建txt文本文件,写入替换后的文本内容
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
File txtFile = new File(fileName.replace("zip", "txt"));
boolean newTxtFile = txtFile.createNewFile();
if (!newTxtFile) {
log.error("id为:{}文件缓存本地失败", id);
return false;
}
bufferedReader = new BufferedReader(new StringReader(zipText));
bufferedWriter = new BufferedWriter(new FileWriter(txtFile));
char buf[] = new char[1024];
int len3;
while ((len3 = bufferedReader.read(buf)) != -1) {
bufferedWriter.write(buf, 0, len3);
}
bufferedWriter.flush();
bufferedReader.close();
bufferedWriter.close();
//压缩txt文本
ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(fileName));
outZip.putNextEntry(new ZipEntry(fileName.replace("zip", "txt")));
FileInputStream inZip = new FileInputStream(txtFile);
int b;
while ((b = inZip.read())!= -1){
outZip.write(b);
}
inZip.close();
outZip.close();
//压缩完后删除txt文件
this.deleteFile(txtFile);
//拿到zip文件
File prdZipFile = new File(fileName);
//上传zip至存储服务器
prdS3.putObject(prdBucketName, filePath, prdZipFile);
if (prdS3.doesObjectExist(prdBucketName, filePath)) {
log.info("bizId为:{},记录id为:{}文件上传成功", bizId, id);
} else {
log.info("bizId为:{},记录id为:{}文件上传后查询为空,上传失败", bizId, id);
}
//删除zip文件
this.deleteFile(prdZipFile);
} catch (Exception e) {
e.printStackTrace();
log.error("执行异常:{}", e.getMessage());
return false;
} finally {
}
return true;
}
3.删除File方法
public void deleteFile(File file) throws Exception{
if (file.exists()){
try {
FileUtils.forceDelete(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
整个迁移的工程还包括了乱七八糟的业务代码,这里主要贴一下读取zip文件txt及解压txt为zip的过程。
船停泊在港湾里非常安全,但那不是造船的目的。 --超级大帅安