pom依赖
< dependency> < groupId> com.amazonaws</ groupId> < artifactId> aws-java-sdk-s3</ artifactId> < version> 1.12.95</ version> </ dependency>
S3Utils
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 > objects = 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 > keys = new LinkedList < > ( ) ; ListObjectsRequest listRequest = new ListObjectsRequest ( ) . withBucketName ( s3Config. getBucketName ( ) ) ; try { ObjectListing objects = s3. listObjects ( listRequest) ; while ( true ) { List < S3ObjectSummary > summaries = 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 > keys, 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 > keys, 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. comaccessKey: xxxxxsecretKey: xxxxbucketName: xxxregion: cn- north- 1 project: xxxmodule : dev