< dependency> < groupId> </ groupId> < artifactId> </ artifactId> < version> </ version> </ dependency> import  cn. hutool. core. util.  ZipUtil ; 
import  com. amazonaws.  ClientConfiguration ; 
import  com. amazonaws. auth.  AWSStaticCredentialsProvider ; 
import  com. amazonaws. auth.  BasicAWSCredentials ; 
import  com. amazonaws. client. builder.  AwsClientBuilder ; 
import  com. amazonaws. services. s3.  AmazonS3 ; 
import  com. amazonaws. services. s3.  AmazonS3ClientBuilder ; 
import  com. amazonaws. services. s3. model.  * ; 
import  com. crm. common. config.  S3Config ; 
import  com. crm. common. enums.  ConflictPolicy ; 
import  com. crm. common. utils.  StringUtils ; 
import  org. springframework. beans. factory. annotation.  Autowired ; 
import  org. springframework. stereotype.  Component ; 
import  org. springframework. web. multipart.  MultipartFile ; 
import  javax. annotation.  PostConstruct ; 
import  javax. servlet. http.  HttpServletResponse ; 
import  java. io.  * ; 
import  java. util.  LinkedList ; 
import  java. util.  List ; 
@Component 
public  class  S3Utils  { 
    private  BasicAWSCredentials  awsCreds =  null ; 
    private  AmazonS3  s3 =  null ; 
    @Autowired 
    S3Config  s3Config; 
    @PostConstruct 
    public  void  init ( )  { 
        
        if  ( StringUtils . isNotBlank ( s3Config. getAccessKey ( ) )  &&  StringUtils . isNotBlank ( s3Config. getSecretKey ( ) ) )  { 
            ClientConfiguration  config =  new  ClientConfiguration ( ) ; 
            AwsClientBuilder. EndpointConfiguration  endpointConfig = 
                    new  AwsClientBuilder. EndpointConfiguration ( s3Config. getEndpoint ( ) ,  "cn-north-1" ) ; 
            awsCreds =  new  BasicAWSCredentials ( s3Config. getAccessKey ( ) ,  s3Config. getSecretKey ( ) ) ; 
            s3 =  AmazonS3ClientBuilder . standard ( ) 
                    . withEndpointConfiguration ( endpointConfig) 
                    . withClientConfiguration ( config) 
                    . withCredentials ( new  AWSStaticCredentialsProvider ( awsCreds) ) 
                    . build ( ) ; 
        } 
    } 
    
    public  String  uploadFile ( MultipartFile  file,  String  moduleName)  { 
        return  uploadFile ( file,  ConflictPolicy . NEW ,  moduleName) ; 
    } 
    
    public  String  uploadFile ( MultipartFile  file,  ConflictPolicy  policy,  String  moduleName)  { 
        if  ( isEmpty ( file) )  { 
            return  null ; 
        } 
        
        File  localFile =  null ; 
        try  { 
            
            String  key =  s3Config. getProject ( )  +  "/"  +  moduleName +  "/"  +  file. getOriginalFilename ( ) ; 
            localFile =  File . createTempFile ( "temp" ,  null ) ; 
            file. transferTo ( localFile) ; 
            String  prefix =  key. substring ( 0 ,  key. lastIndexOf ( "." ) ) ; 
            String  suffix =  key. substring ( key. indexOf ( "." ) ) ; 
            
            int  maxNum =  getMaxVersionNum ( s3Config. getBucketName ( ) ,  prefix,  suffix) ; 
            if  ( maxNum !=  - 1 )  { 
                switch  ( policy)  { 
                    case  NEW : 
                        key =  prefix +  "("  +  ( ++ maxNum)  +  ")"  +  suffix; 
                        break ; 
                    case  RETAIN : 
                        return  "文件已存在,根据冲突策略,文件不予替换" ; 
                    case  REPLACE : 
                    default : 
                        break ; 
                } 
            } 
            PutObjectRequest  request =  new  PutObjectRequest ( s3Config. getBucketName ( ) ,  key,  localFile) ; 
            
            PutObjectResult  putObjectResult =  s3. putObject ( request) ; 
            if  ( StringUtils . isNotEmpty ( putObjectResult. getETag ( ) ) )  { 
                return  key; 
            } 
            return  null ; 
        }  catch  ( IOException  e)  { 
            e. printStackTrace ( ) ; 
        }  catch  ( Exception  e)  { 
            e. printStackTrace ( ) ; 
        }  finally  { 
            if  ( localFile !=  null )  { 
                localFile. delete ( ) ; 
            } 
        } 
        return  null ; 
    } 
    private  int  getMaxVersionNum ( String  bucketName,  String  prefix,  String  suffix)  { 
        ListObjectsRequest  listRequest =  new  ListObjectsRequest ( ) . withBucketName ( bucketName) . withPrefix ( prefix) . withMaxKeys ( 100 ) ; 
        ObjectListing  objectListing =  s3. listObjects ( listRequest) ; 
        int  value =  - 1 ; 
        for  ( S3ObjectSummary  inst :  objectListing. getObjectSummaries ( ) )  { 
            String  indexStr =  inst. getKey ( ) . replace ( prefix,  "" ) . replace ( "(" ,  "" ) . replace ( ")" ,  "" ) . replace ( suffix,  "" ) ; 
            if  ( indexStr. length ( )  ==  0 )  { 
                indexStr =  "0" ; 
            } 
            value =  Math . max ( value,  Integer . parseInt ( indexStr) ) ; 
        } 
        return  value; 
    } 
    
    public  void  deleteObject ( String  key)  { 
        if  ( StringUtils . isBlank ( key) )  { 
            throw  new  IllegalArgumentException ( "key can not be null" ) ; 
        } 
        s3. deleteObject ( s3Config. getBucketName ( ) ,  key) ; 
    } 
    
    public  S3ObjectInputStream  getFileInputStream ( String  key)  { 
        S3Object  object =  s3. getObject ( new  GetObjectRequest ( s3Config. getBucketName ( ) ,  key) ) ; 
        return  object. getObjectContent ( ) ; 
    } 
    
    public  void  downloadFile ( String  key,  OutputStream  stream)  { 
        InputStream  input =  getFileInputStream ( key) ; 
        byte [ ]  data =  null ; 
        try  { 
            data =  new  byte [ input. available ( ) ] ; 
            int  len =  0 ; 
            while  ( ( len =  input. read ( data) )  !=  - 1 )  { 
                stream. write ( data,  0 ,  len) ; 
            } 
        }  catch  ( IOException  e)  { 
            e. printStackTrace ( ) ; 
        }  finally  { 
            if  ( stream !=  null )  { 
                try  { 
                    stream. close ( ) ; 
                }  catch  ( IOException  e)  { 
                    e. printStackTrace ( ) ; 
                } 
            } 
            if  ( input !=  null )  { 
                try  { 
                    input. close ( ) ; 
                }  catch  ( IOException  e)  { 
                    e. printStackTrace ( ) ; 
                } 
            } 
        } 
    } 
    
    public  void  downloadFile ( String  key,  HttpServletResponse  response)  { 
        String  fileName =  key; 
        byte [ ]  data =  null ; 
        OutputStream  stream =  null ; 
        InputStream  input =  getFileInputStream ( key) ; 
        if  ( key. contains ( "/" ) )  { 
            String [ ]  path =  key. split ( "/" ) ; 
            fileName =  path[ path. length -  1 ] ; 
        } 
        response. setHeader ( "Content-Disposition" ,  "attachment; filename="  +  fileName) ; 
        try  { 
            stream =  response. getOutputStream ( ) ; 
            data =  new  byte [ input. available ( ) ] ; 
            int  len =  0 ; 
            while  ( ( len =  input. read ( data) )  !=  - 1 )  { 
                stream. write ( data,  0 ,  len) ; 
            } 
        }  catch  ( IOException  e)  { 
            e. printStackTrace ( ) ; 
        }  finally  { 
            if  ( stream !=  null )  { 
                try  { 
                    stream. close ( ) ; 
                }  catch  ( IOException  e)  { 
                    e. printStackTrace ( ) ; 
                } 
            } 
            if  ( input !=  null )  { 
                try  { 
                    input. close ( ) ; 
                }  catch  ( IOException  e)  { 
                    e. printStackTrace ( ) ; 
                } 
            } 
        } 
    } 
    
    public  void  deleteFolder ( String  filePath,  boolean  deleteAll)  { 
        ListObjectsV2Request  objectsRequest =  new  ListObjectsV2Request ( ) ; 
        objectsRequest. setBucketName ( s3Config. getBucketName ( ) ) ; 
        objectsRequest. setPrefix ( filePath) ; 
        
        objectsRequest. setDelimiter ( deleteAll ?  ""  :  "/" ) ; 
        
        objectsRequest. setMaxKeys ( 1000 ) ; 
        ListObjectsV2Result  listObjectsRequest =  s3. listObjectsV2 ( objectsRequest) ; 
        List < S3ObjectSummary > =  listObjectsRequest. getObjectSummaries ( ) ; 
        String [ ]  object_keys =  new  String [ objects. size ( ) ] ; 
        for  ( int  i =  0 ;  i <  objects. size ( ) ;  i++ )  { 
            S3ObjectSummary  item =  objects. get ( i) ; 
            object_keys[ i]  =  item. getKey ( ) ; 
        } 
        DeleteObjectsRequest  dor =  new  DeleteObjectsRequest ( s3Config. getBucketName ( ) ) . withKeys ( object_keys) ; 
        s3. deleteObjects ( dor) ; 
    } 
    
    public  boolean  isEmpty ( MultipartFile  file)  { 
        if  ( file ==  null  ||  file. getSize ( )  <=  0 )  { 
            return  true ; 
        } 
        return  false ; 
    } 
    
    public  List < String > getFileKeys ( )  { 
        List < String > =  new  LinkedList < > ( ) ; 
        ListObjectsRequest  listRequest =  new  ListObjectsRequest ( ) . withBucketName ( s3Config. getBucketName ( ) ) ; 
        try  { 
            ObjectListing  objects =  s3. listObjects ( listRequest) ; 
            while  ( true )  { 
                List < S3ObjectSummary > =  objects. getObjectSummaries ( ) ; 
                for  ( S3ObjectSummary  summary :  summaries)  { 
                    keys. add ( summary. getKey ( ) ) ; 
                } 
                if  ( objects. isTruncated ( ) )  { 
                    objects =  s3. listNextBatchOfObjects ( objects) ; 
                }  else  { 
                    break ; 
                } 
            } 
        }  catch  ( Exception  exception)  { 
            exception. printStackTrace ( ) ; 
        } 
        return  keys; 
    } 
    public  void  getBizFile ( List < String > ,  File  targetZipFile)  { 
        InputStream [ ]  inputStreams =  keys. stream ( ) . map ( this :: getFileInputStream ) . toArray ( InputStream [ ] :: new ) ; 
        String [ ]  strings =  keys. stream ( ) . map ( key ->  key. split ( "/" ) [ key. split ( "/" ) . length -  1 ] ) . toArray ( String [ ] :: new ) ; 
        ZipUtil . zip ( targetZipFile,  strings,  inputStreams) ; 
    } 
    public  void  downBizFile ( List < String > ,  HttpServletResponse  response)  { 
        File  file =  new  File ( System . currentTimeMillis ( )  +  ".zip" ) ; 
        getBizFile ( keys,  file) ; 
        OutputStream  toClient =  null ; 
        try  { 
            
            BufferedInputStream  fis =  new  BufferedInputStream ( new  FileInputStream ( file. getPath ( ) ) ) ; 
            byte [ ]  buffer =  new  byte [ fis. available ( ) ] ; 
            fis. read ( buffer) ; 
            fis. close ( ) ; 
            
            response. reset ( ) ; 
            toClient =  new  BufferedOutputStream ( response. getOutputStream ( ) ) ; 
            response. setCharacterEncoding ( "UTF-8" ) ; 
            response. setContentType ( "application/octet-stream" ) ; 
            response. setHeader ( "Content-Disposition" ,  "attachment;filename="  +  file. getName ( ) ) ; 
            toClient. write ( buffer) ; 
            toClient. flush ( ) ; 
        }  catch  ( Exception  e)  { 
           e. printStackTrace ( ) ; 
        }  finally  { 
            if  ( toClient !=  null )  { 
                try  { 
                    toClient. close ( ) ; 
                }  catch  ( IOException  e)  { 
                    e. printStackTrace ( ) ; 
                } 
            } 
            
            file. delete ( ) ; 
        } 
    } 
} 
public  enum  ConflictPolicy  { 
    REPLACE ,  NEW ,  RETAIN 
} 
@Component 
@ConfigurationProperties ( prefix= "aws.s3" ) 
public  class  S3Config  { 
    private  String  accessKey; 
    private  String  secretKey; 
    private  String  bucketName; 
    private  String  region; 
    private  String  project; 
    private  String  module ; 
    private  String  endpoint; 
    public  String  getEndpoint ( )  { 
        return  endpoint; 
    } 
    public  void  setEndpoint ( String  endpoint)  { 
        this . endpoint =  endpoint; 
    } 
    public  String  getModule ( )  { 
        return  module ; 
    } 
    public  void  setModule ( String  module )  { 
        this . module  =  module ; 
    } 
    public  String  getAccessKey ( )  { 
        return  accessKey; 
    } 
    public  void  setAccessKey ( String  accessKey)  { 
        this . accessKey =  accessKey; 
    } 
    public  String  getSecretKey ( )  { 
        return  secretKey; 
    } 
    public  void  setSecretKey ( String  secretKey)  { 
        this . secretKey =  secretKey; 
    } 
    public  String  getBucketName ( )  { 
        return  bucketName; 
    } 
    public  void  setBucketName ( String  bucketName)  { 
        this . bucketName =  bucketName; 
    } 
    public  String  getRegion ( )  { 
        return  region; 
    } 
    public  void  setRegion ( String  region)  { 
        this . region =  region; 
    } 
    public  String  getProject ( )  { 
        return  project; 
    } 
    public  void  setProject ( String  project)  { 
        this . project =  project; 
    } 
} 
aws: 
  s3: 
    endpoint:  https: / / s3- xxxxx. com
    accessKey:  xxxxx
    secretKey:  xxxx
    bucketName:  xxx
    region:  cn- north- 1 
    project:  xxx
    module :  dev