公司的前端js,css是發布到oss的,所以要求后台在發布的同時先把即將要覆蓋的文件備份到服務器上
步驟是先上傳文件到服務器,服務器上傳到oss服務器之前先備份相同文件名的文件
public class OssVersionPublishController {
@Value("${oss.endpoint}")
public String endpoint;
@Value("${oss.accessKeyId}")
public String accessKeyId;
@Value("${oss.secretAccessKey}")
public String secretAccessKey;
@Value("${oss.bucketName}")
public String bucketName;
@Value("${oss.url}")
public String url;
public OSSClient getOSSClient(){
return new OSSClient(endpoint, accessKeyId, secretAccessKey);
}
/**
* 上傳文件到oss
* */
private boolean publishFile(List<OssVersionPublishContent> contentList,String updName){
OSSClient ossClient = getOSSClient();
try {
// 文件的父父目錄
String folder =contentList.get(0).getPublishBatch();
// 查找上傳的文件是否存在oss?先備份后覆蓋,先在本地服務器上創建文件夾(批次命名),先把上一次的刪掉了
String deposeFilesDir="/home/admin/ossBackUp/"+folder;
File dest = new File(deposeFilesDir);
if(dest.exists()){
delFile(dest);
}
dest.mkdirs();//本地服務器創建好目錄
for(OssVersionPublishContent content:contentList){
// 文件的父目錄,判斷輸入的文件是否有父目錄
boolean isExistSup= content.getFileName().contains("/");
boolean read = true;
boolean isDoesObjectExist=true;
try {
isDoesObjectExist=ossClient.doesObjectExist(bucketName,content.getFileName());
} catch (Exception e) {
isDoesObjectExist = false;
logger.warn("isDoesObjectExist異常:{}",e.getMessage());
}
if(isDoesObjectExist){//oss存在相同文件
//文件備份
String filePath = (deposeFilesDir +"/"+ content.getFileName()).replace("\\","/");
File targetFile= new File(filePath);
if(isExistSup){
if (!targetFile.getParentFile().exists()) {
targetFile.getParentFile().mkdirs();
}
}
OSSObject ossObject = ossClient.getObject(bucketName,content.getFileName());
FileOutputStream fos = null;
InputStream stream = null;
try {
fos = new FileOutputStream(targetFile);
stream = ossObject.getObjectContent();
byte[] buffer = new byte[1024*1024];
int byteRead = 0;
while((byteRead=stream.read(buffer))!=-1){
fos.write(buffer, 0, byteRead);
fos.flush();
}
} catch (Exception e) {
read = false;
logger.warn("oss文件備份到本地服務器失敗{}",e.getMessage());
return false;
}finally{
try {
if(fos!=null){
fos.close();
}
if(stream!=null){
stream.close();
}
} catch (Exception e) {}
}
}
PutObjectResult result = ossClient.putObject(bucketName, content.getFileName(), new File(content.getFileUrl()));
logger.info("上傳結果:{}",result.getETag());
if(read){
content.setOperateTime(new Date());
content.setOperator(updName);
content.setPublishStatus(true);
content.setPublishTime(new Date());
content.setFileStatus(true);
ossVersionPublishContentBiz.updateByPrimaryKey(content);
}
};
} catch (Exception e) {
logger.warn("發布失敗={}",e.getMessage());
return false;
}finally{
ossClient.shutdown();
}
return true;
}
/**
* 還原
* */
@PostMapping(value = "/restore/{id}")
@ResponseBody
public ObjectRestResponse<OssVersionPublish> restore(@PathVariable Long id,HttpServletRequest request) {
String token = StringUtils.trimToEmpty(request.getHeader(userAuthConfig.getJwtTokenHeader()));//得到用戶token
try {
OssVersionPublish ossVersionPublish = ossVersionPublishBiz.selectByPrimaryKey(id);
if(StringUtil.isBlank(ossVersionPublish.getPublishBatch())){
return new ObjectRestResponse<OssVersionPublish>(1, "獲取參數異常");
}
// 修改發布版本批次的狀態為未發布
String updName = userAuthUtil.getInfoFromToken(token).getUniqueName();
// 找到指定的目錄下的所有文件,然后覆蓋到oss相應的地方
String deposeFilesDir="/home/admin/ossBackUp/"+ossVersionPublish.getPublishBatch();
File dest = new File(deposeFilesDir);
if(!dest.exists()){
return new ObjectRestResponse<OssVersionPublish>(1, "備份文件丟失");
}
boolean flag = restoreToOss(dest,ossVersionPublish.getPublishBatch());
if(flag){
ossVersionPublish.setOperator(updName);
ossVersionPublish.setOperateTime(new Date());
ossVersionPublish.setPublishStatus(false);
int resCount = ossVersionPublishBiz.updateByPrimaryKey(ossVersionPublish);
if(resCount>0){
return new ObjectRestResponse<OssVersionPublish>(0, "還原成功");
}
}
} catch (Exception e) {
logger.warn("oss發布失敗{}",e.getMessage());
return new ObjectRestResponse<OssVersionPublish>(1, "還原失敗");
}
return new ObjectRestResponse<OssVersionPublish>(1, "還原失敗");
}
/**
* 還原備份到oss
* @param publishBatch
* */
private boolean restoreToOss(File dest, String publishBatch){
OSSClient ossClient = getOSSClient();
if(dest.isDirectory()) {
File[] files = dest.listFiles();
logger.info("dest下的文件數量=={}",files.length);
if(files.length==0){
return true;
}
for (File f : files) {
if(f.isFile()){
logger.info("路徑={},版本批次={}",f.getPath(),publishBatch);
String gt = f.getPath().substring(f.getPath().indexOf(publishBatch)+publishBatch.length()+1);
logger.info("文件路徑:{}",gt);
// 上傳文件
PutObjectResult result = ossClient.putObject(bucketName,gt, f);
logger.info("上傳結果:{}",result.getETag());
}else{
logger.info("目錄繼續找文件=={0},{1}",f,publishBatch);
restoreToOss(f,publishBatch);
}
}
}
return true;
}
}