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<GetObjectResponse> downloadFile(String key,String bucketName){
|
GetObjectRequest objectRequest = GetObjectRequest
|
.builder()
|
.key(key)
|
.bucket(bucketName)
|
.build();
|
ResponseBytes<GetObjectResponse> 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<GetObjectResponse> 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<String> keys, String bucketName){
|
ArrayList<ObjectIdentifier> to_delete = new ArrayList<ObjectIdentifier>();
|
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;
|
}
|
}
|
|
}
|