公司的前端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,以及备份的更多相关文章

  1. xshell终端向远程服务器上传文件方法

    centos-7下在本地终端里向远程服务器上传文件,在命令行中执行的软件. 安装命令如下: 在终端里输入如下命令: 会弹出如下窗口 选择你要上传的文件即可上传成功.

  2. 关于nutz跨服务器上传文件

    关于nutz跨服务器上传文件  发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子  标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器 ...

  3. Java模拟客户端向服务器上传文件

    先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...

  4. idea 内置tomcat jersey 跨服务器 上传文件报400错误

    报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status ...

  5. 【FTP】C# System.Net.FtpClient库连接ftp服务器(上传文件)

    如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://net ...

  6. ASP.NET跨服务器上传文件的相关解决方案

    第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ ...

  7. Javaweb向服务器上传文件以及从服务器下载文件的方法

    先导入jar包 点击下载 commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流. comm ...

  8. 使用Putty实现windows向阿里云的Linux云服务器上传文件

    1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动 ...

  9. asp.net 服务器 上传文件到 FTP服务器

    private string ftpServerIP = "服务器ip";//服务器ip private string ftpUserID = "ftp的用户名" ...

随机推荐

  1. 渗透测试-基于白名单执行payload--Pcalua

    0x01 Pcalua简介 Windows进程兼容性助理(Program Compatibility Assistant)的一个组件. 说明:Pcalua.exe所在路径已被系统添加PATH环境变量中 ...

  2. nginx::certbot制作免费证书

    环境 Ubuntu8.04apt-get update apt-get install software-properties-common add-apt-repository ppa:certbo ...

  3. 点击任何位置隐藏所需隐藏的元素 (无BUG/jQuery版)

    1>第一种分两步 1) :对document的click事件绑定事件处理程序,使其隐藏该div 2) :对div的click事件绑定事件处理程序,阻止事件冒泡,防止其冒泡到document,而调 ...

  4. CVE 2019-0708漏洞复现防御修复

    CVE-2019-0708 Windows再次被曝出一个破坏力巨大的高危远程漏洞CVE-2019-0708.攻击者一旦成功利用该漏洞,便可以在目标系统上执行任意代码,包括获取敏感信息.执行远程代码.发 ...

  5. postman设置环境变量与全局变量

    1.环境变量可以设置多组 设置环境变量 编辑环境变量 2.全局变量只能设置一组 可以在Pre-request Script和Tests中设置全局变量 如:pm.globals.set("na ...

  6. Spring Boot 2.X(十一):全局异常处理

    前言 在 Java Web 系统开发中,不管是 Controller 层.Service 层还是 Dao 层,都有可能抛出异常.如果在每个方法中加上各种 try catch 的异常处理代码,那样会使代 ...

  7. 零基础教程!一文教你使用Rancher 2.3和Terraform运行Windows容器

    本文来自Rancher Labs 介 绍 在Kubernetes 1.14版本中已经GA了对Windows的支持.这一结果凝结了一群优秀的工程师的努力,他们来自微软.Pivotal.VMware.红帽 ...

  8. 打python&adb组合拳,实现微信读书永久免费读

    用过“微信读书”的朋友都知道,如果我们想阅读全本的付费书籍,除了购买整本(使用书币)外,还可以使用无限卡.可无论是购买全书还是无限卡,归根结底都是要花银子的. 除此之外,还有一种方式——用阅读时长兑换 ...

  9. 使PC端网页宽度自适应手机屏幕大小

    有时候我们会纠结PC页面在手机页面上无法正常显示,超出屏幕,有些内容看不到,现在又了下面的代码,可以做到自适应手机端的屏幕宽度: 在html的<head>中增加一个meta标签: < ...

  10. 小白学 Python(13):基础数据结构(字典)(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...