服务器上传文件到oss,以及备份
公司的前端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;
}
}
服务器上传文件到oss,以及备份的更多相关文章
- xshell终端向远程服务器上传文件方法
centos-7下在本地终端里向远程服务器上传文件,在命令行中执行的软件. 安装命令如下: 在终端里输入如下命令: 会弹出如下窗口 选择你要上传的文件即可上传成功.
- 关于nutz跨服务器上传文件
关于nutz跨服务器上传文件 发布于 578天前 作者 yong9664 770 次浏览 复制 上一个帖子 下一个帖子 标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器 ...
- Java模拟客户端向服务器上传文件
先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...
- idea 内置tomcat jersey 跨服务器 上传文件报400错误
报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status ...
- 【FTP】C# System.Net.FtpClient库连接ftp服务器(上传文件)
如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://net ...
- ASP.NET跨服务器上传文件的相关解决方案
第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ ...
- Javaweb向服务器上传文件以及从服务器下载文件的方法
先导入jar包 点击下载 commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流. comm ...
- 使用Putty实现windows向阿里云的Linux云服务器上传文件
1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动 ...
- asp.net 服务器 上传文件到 FTP服务器
private string ftpServerIP = "服务器ip";//服务器ip private string ftpUserID = "ftp的用户名" ...
随机推荐
- Java 8 Optional:优雅地避免 NPE
本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查.在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的. 空指针异常(NullPo ...
- PHP绕过disable_function限制(一)
测试环境 php 5.4.5 0x01 利用系统组件绕过 1.window com组件(php 5.4)(高版本扩展要自己添加) (COM组件它最早的设计意图是,跨语言实现程序组件的复用.) 测试: ...
- c++::Mysql::ORM 开发环境搭建
官网地址:https://www.codesynthesis.com/products/odb/ 环境搭建:ubuntu16.04-64 1.安装mysqlClient sudo apt-get in ...
- 06_基本框架_VMCS_GuestArea
1 Guest-State Area 1.1 References 注释: 其实 内容很多 一般是不背 的:需要的时候来查就行:但是要大致知道是做啥的. 代码 > 设置 Guest Area / ...
- 近万字案例:Rancher + VMware PKS实现全球数百站点K8S集群管理
Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的.基于云的技术平台,以更好地应对业务挑战.曾连续3年提名CRN,并且在2012 ...
- SQL 方面基础操作,主要针对数据库方面的操作步骤
SQL 结构化查询语言 适用于所有的SQL数据库 SQL 要求每条指令后末端 都要有分号(;),分号是标准方法,对服务器相同请求中执行一条以上的sql语句. 最终目的: 实现对数据库数据的 增 ...
- javascript单线程,异步与执行机制
js的单线程模型与游览器的进程/线程息息相关,在了解js单线程与异步的时候,建议先看看这篇文章 为什么是单线程 由于js是可操作dom的,如果js是多线程,在多线程的交互下,处于界面中的dom节点就可 ...
- jQuery选择器 大于 空格 波浪线 加号
JQuery选择器 大于 空格 波浪线 加号的区别 元素遍历 符号 说明 空格 $(‘parent child’)表示获取parent下的所有的child节点(所有的子孙). 大于号 $(‘paren ...
- 设计模式(七)Builder模式
Builder模式,从这个名字我们可以看出来,这种设计模式就是用于组装具有复杂结构的实例的. 下面还是以一个实例程序来解释这种设计模式,先看实例程序的类图. 这里为了调试方便,只实现其中一个功能Tex ...
- ZTUnity Profiler概述及Profiler window 说明
转贴链接:https://www.jianshu.com/p/ca2ee8a51754