package com.common.aws.util; import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider; import software.amazon.awssdk.core.ResponseBytes; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.*; import sun.misc.BASE64Encoder; import java.util.ArrayList; import java.util.List; /** * @author Ben Pi * @date 2022-01-21 */ @Slf4j public class S3Util { // 创建s3对象 private static final S3Client s3Client = S3Client.builder() .credentialsProvider(InstanceProfileCredentialsProvider.builder().build()) .build(); // public static final S3Client getS3ClientUsingEC2Instance(){ // return S3Client.builder() // .credentialsProvider(InstanceProfileCredentialsProvider.builder().build()) // .build(); // } /** * 上传文件 * * @param key 上传路径 */ public static String uploadFile(MultipartFile file,String key,String bucketName) { try { log.info("文件上传key:{}",key); // 设置文件上传对象 PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(bucketName).key(key).build(); // 上传文件 PutObjectResponse putObjectResponse = s3Client.putObject(putObjectRequest, RequestBody.fromBytes(file.getBytes())); if (null != putObjectResponse) { log.info("文件上传成功:{}",key); return key; } return null; } catch (Exception e) { log.error("upload file error",e); } return null; } /** * 文件下载 * @param key 文件的key * @return */ public static ResponseBytes downloadFile(String key,String bucketName){ GetObjectRequest objectRequest = GetObjectRequest .builder() .key(key) .bucket(bucketName) .build(); ResponseBytes objectBytes = s3Client.getObjectAsBytes(objectRequest); return objectBytes; } /** * s3文件预览 * @param key */ public static String DownloadFromS3(String key,String bucketName) { BASE64Encoder encoder = new BASE64Encoder(); GetObjectRequest objectRequest = GetObjectRequest .builder() .key(key) .bucket(bucketName) .build(); ResponseBytes objectBytes = s3Client.getObjectAsBytes(objectRequest); byte[] data = objectBytes.asByteArray(); // 转换成base64文件流,用于前端数据解析 return encoder.encodeBuffer(data).trim(); } public static String getURL(String keyName,String bucketName) { String url = null; try { GetUrlRequest request = GetUrlRequest.builder() .bucket(bucketName) .key(keyName) .build(); url =s3Client.utilities().getUrl(request).toString(); return url; } catch (S3Exception e) { e.awsErrorDetails().errorMessage(); } return url; } public static DeleteObjectResponse deleteByKey(String key,String bucketName){ DeleteObjectRequest build = DeleteObjectRequest .builder() .key(key) .bucket(bucketName) .build(); return s3Client.deleteObject(build); } public static void deleteByKeys(List keys, String bucketName){ ArrayList to_delete = new ArrayList(); for (String key : keys) { to_delete.add(ObjectIdentifier.builder().key(key).build()); } try{ DeleteObjectsRequest build = DeleteObjectsRequest.builder() .bucket(bucketName) .delete(Delete.builder().objects(to_delete).build()) .build(); s3Client.deleteObjects(build); }catch (S3Exception e){ log.warn("AWS S3 删除多对象异常:"+e); throw e; } } }