content: package org.jeecg.common.util.oss;
  
  import com.aliyun.oss.ClientConfiguration;
  import com.aliyun.oss.OSSClient;
  import com.aliyun.oss.common.auth.DefaultCredentialProvider;
  import com.aliyun.oss.model.CannedAccessControlList;
  import com.aliyun.oss.model.OSSObject;
  import com.aliyun.oss.model.PutObjectResult;
  import lombok.extern.slf4j.Slf4j;
  import org.apache.tomcat.util.http.fileupload.FileItemStream;
  import org.jeecg.common.util.CommonUtils;
  import org.jeecg.common.util.filter.StrAttackFilter;
  import org.jeecg.common.util.oConvertUtils;
  import org.springframework.web.multipart.MultipartFile;
  
  import java.io.BufferedInputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.URL;
  import java.net.URLDecoder;
  import java.util.Date;
  import java.util.UUID;
  
  /**
   * @Description: 阿里云 oss 上传工具类(高依赖版)
   * @Date: 2019/5/10
   */
  @Slf4j
  public class OssBootUtil {
  
      private static String endPoint;
      private static String accessKeyId;
      private static String accessKeySecret;
      private static String bucketName;
      private static String staticDomain;
  
      public static void setEndPoint(String endPoint) {
          OssBootUtil.endPoint = endPoint;
      }
  
      public static void setAccessKeyId(String accessKeyId) {
          OssBootUtil.accessKeyId = accessKeyId;
      }
  
      public static void setAccessKeySecret(String accessKeySecret) {
          OssBootUtil.accessKeySecret = accessKeySecret;
      }
  
      public static void setBucketName(String bucketName) {
          OssBootUtil.bucketName = bucketName;
      }
  
      public static void setStaticDomain(String staticDomain) {
          OssBootUtil.staticDomain = staticDomain;
      }
  
      public static String getStaticDomain() {
          return staticDomain;
      }
  
      public static String getEndPoint() {
          return endPoint;
      }
  
      public static String getAccessKeyId() {
          return accessKeyId;
      }
  
      public static String getAccessKeySecret() {
          return accessKeySecret;
      }
  
      public static String getBucketName() {
          return bucketName;
      }
  
      public static OSSClient getOssClient() {
          return ossClient;
      }
  
      /**
       * oss 工具客户端
       */
      private static OSSClient ossClient = null;
  
      /**
       * 上传文件至阿里云 OSS
       * 文件上传成功,返回文件完整访问路径
       * 文件上传失败,返回 null
       *
       * @param file    待上传文件
       * @param fileDir 文件保存目录
       * @return oss 中的相对文件路径
       */
      public static String upload(MultipartFile file, String fileDir,String customBucket) {
          String FILE_URL = null;
          initOSS(endPoint, accessKeyId, accessKeySecret);
          StringBuilder fileUrl = new StringBuilder();
          String newBucket = bucketName;
          if(oConvertUtils.isNotEmpty(customBucket)){
              newBucket = customBucket;
          }
          try {
              //判断桶是否存在,不存在则创建桶
              if(!ossClient.doesBucketExist(newBucket)){
                  ossClient.createBucket(newBucket);
              }
              // 获取文件名
              String orgName = file.getOriginalFilename();
              if("" == orgName){
                orgName=file.getName();
              }
              orgName = CommonUtils.getFileName(orgName);
              String fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
              if (!fileDir.endsWith("/")) {
                  fileDir = fileDir.concat("/");
              }
              //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符，防止攻击
              fileDir=StrAttackFilter.filter(fileDir);
              //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符，防止攻击
              fileUrl = fileUrl.append(fileDir + fileName);
  
              if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
                  FILE_URL = staticDomain + "/" + fileUrl;
              } else {
                  FILE_URL = "https://" + newBucket + "." + endPoint + "/" + fileUrl;
              }
              PutObjectResult result = ossClient.putObject(newBucket, fileUrl.toString(), file.getInputStream());
              // 设置权限(公开读)
  //            ossClient.setBucketAcl(newBucket, CannedAccessControlList.PublicRead);
              if (result != null) {
                  log.info("------OSS文件上传成功------" + fileUrl);
              }
          } catch (IOException e) {
              e.printStackTrace();
              return null;
          }
          return FILE_URL;
      }
  
      /**
       * 获取原始URL
      * @param url: 原始URL
      * @Return: java.lang.String
      */
      public static String getOriginalUrl(String url) {
          String originalDomain = "https://" + bucketName + "." + endPoint;
          if(url.indexOf(staticDomain)!=-1){
              url = url.replace(staticDomain,originalDomain);
          }
          return url;
      }
  
      /**
       * 文件上传
       * @param file
       * @param fileDir
       * @return
       */
      public static String upload(MultipartFile file, String fileDir) {
          return upload(file, fileDir,null);
      }
  
      /**
       * 上传文件至阿里云 OSS
       * 文件上传成功,返回文件完整访问路径
       * 文件上传失败,返回 null
       *
       * @param file    待上传文件
       * @param fileDir 文件保存目录
       * @return oss 中的相对文件路径
       */
      public static String upload(FileItemStream file, String fileDir) {
          String FILE_URL = null;
          initOSS(endPoint, accessKeyId, accessKeySecret);
          StringBuilder fileUrl = new StringBuilder();
          try {
              String suffix = file.getName().substring(file.getName().lastIndexOf('.'));
              String fileName = UUID.randomUUID().toString().replace("-", "") + suffix;
              if (!fileDir.endsWith("/")) {
                  fileDir = fileDir.concat("/");
              }
              fileDir = StrAttackFilter.filter(fileDir);
              fileUrl = fileUrl.append(fileDir + fileName);
              if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
                  FILE_URL = staticDomain + "/" + fileUrl;
              } else {
                  FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
              }
              PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream());
              // 设置权限(公开读)
              ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
              if (result != null) {
                  log.info("------OSS文件上传成功------" + fileUrl);
              }
          } catch (IOException e) {
              e.printStackTrace();
              return null;
          }
          return FILE_URL;
      }
  
      /**
       * 删除文件
       * @param url
       */
      public static void deleteUrl(String url) {
          deleteUrl(url,null);
      }
  
      /**
       * 删除文件
       * @param url
       */
      public static void deleteUrl(String url,String bucket) {
          String newBucket = bucketName;
          if(oConvertUtils.isNotEmpty(bucket)){
              newBucket = bucket;
          }
          String bucketUrl = "";
          if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
              bucketUrl = staticDomain + "/" ;
          } else {
              bucketUrl = "https://" + newBucket + "." + endPoint + "/";
          }
          url = url.replace(bucketUrl,"");
          ossClient.deleteObject(newBucket, url);
      }
  
      /**
       * 删除文件
       * @param fileName
       */
      public static void delete(String fileName) {
          ossClient.deleteObject(bucketName, fileName);
      }
  
      /**
       * 获取文件流
       * @param objectName
       * @param bucket
       * @return
       */
      public static InputStream getOssFile(String objectName,String bucket){
          InputStream inputStream = null;
          try{
              String newBucket = bucketName;
              if(oConvertUtils.isNotEmpty(bucket)){
                  newBucket = bucket;
              }
              initOSS(endPoint, accessKeyId, accessKeySecret);
              OSSObject ossObject = ossClient.getObject(newBucket,objectName);
              inputStream = new BufferedInputStream(ossObject.getObjectContent());
          }catch (Exception e){
              log.info("文件获取失败" + e.getMessage());
          }
          return inputStream;
      }
  
      /**
       * 获取文件流
       * @param objectName
       * @return
       */
      public static InputStream getOssFile(String objectName){
          return getOssFile(objectName,null);
      }
  
      /**
       * 获取文件外链
       * @param bucketName
       * @param objectName
       * @param expires
       * @return
       */
      public static String getObjectURL(String bucketName, String objectName, Date expires) {
          initOSS(endPoint, accessKeyId, accessKeySecret);
          try{
              if(ossClient.doesObjectExist(bucketName,objectName)){
                  URL url = ossClient.generatePresignedUrl(bucketName,objectName,expires);
                  return URLDecoder.decode(url.toString(),"UTF-8");
              }
          }catch (Exception e){
              log.info("文件路径获取失败" + e.getMessage());
          }
          return null;
      }
  
      /**
       * 初始化 oss 客户端
       *
       * @return
       */
      private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
          if (ossClient == null) {
              ossClient = new OSSClient(endpoint,
                      new DefaultCredentialProvider(accessKeyId, accessKeySecret),
                      new ClientConfiguration());
          }
          return ossClient;
      }
  
  
      /**
       * 上传文件到oss
       * @param stream
       * @param relativePath
       * @return
       */
      public static String upload(InputStream stream, String relativePath) {
          String FILE_URL = null;
          String fileUrl = relativePath;
          initOSS(endPoint, accessKeyId, accessKeySecret);
          if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
              FILE_URL = staticDomain + "/" + relativePath;
          } else {
              FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
          }
          PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(),stream);
          // 设置权限(公开读)
          ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
          if (result != null) {
              log.info("------OSS文件上传成功------" + fileUrl);
          }
          return FILE_URL;
      }
  
  
  }