测试用户
2023-04-13 43393f2bb11cbf9e6af40077bbc5284660e8a754
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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;
        }
    }
 
}