peng
2026-03-25 2e5c2bc2b7afc7926ec441ff083acd179cb29fc6
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package com.tievd.jyz.util;
 
import com.amazonaws.ClientConfiguration;
import com.amazonaws.HttpMethod;
import com.amazonaws.Protocol;
import com.amazonaws.SDKGlobalConfiguration;
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.model.GeneratePresignedUrlRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.S3Object;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
 
import javax.annotation.PostConstruct;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
 
/**
 * S3协议存储处理工具类
 * @author Wang
 *
 */
@Component
public class S3Util {
 
    public final String HTTPS_STR = "HTTPS";
 
    @Value("${init.minio.minio_name}")
    public String accessKey;
    @Value("${init.minio.minio_pass}")
    public String secretKey;
    @Value("${init.minio.bucketName}")
    public String bucketName;
    @Value("${init.minio.minio_url}")
    public String serviceEndpoint;
    @Value("${init.minio.ext_minio_url:${init.minio.minio_url}}")
    public String extServiceEndpoint;
    @Value("${init.minio.device_minio_url:${init.minio.ext_minio_url:${init.minio.minio_url}}}")
    public String deviceServiceEndpoint;
 
    @Value("${init.minio.pathStyle:true}")
    public boolean isPathStyle;
 
    private static AmazonS3 conn = null;
 
    /**
     * 上传文件
     * @param bytes
     * @param key s3 key名
     * @param bucketName s3桶名
     * @return
     * @throws Exception
     */
    public String uploadObject(byte[] bytes, String key, String bucketName) throws Exception {
        try(InputStream inputStream = new ByteArrayInputStream(bytes);){
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(inputStream.available());
            conn.putObject(bucketName, key, inputStream, metadata);
            return key;
        }
    }
 
    /**
     * 上传文件
     * @param bytes 数据
     * @param fileName 文件名
     * @return
     * @throws Exception
     */
    public String uploadObject(byte[] bytes,String fileName) throws Exception {
        try(InputStream inputStream = new ByteArrayInputStream(bytes);){
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(inputStream.available());
            String key = fileName.substring(0, fileName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));
            conn.putObject(bucketName, key, inputStream, metadata);
            return key;
        }
    }
 
 
    /**
     * 根据文件名称进行删除
     * @param bucketName
     * @param key
     * @return
     */
    public void delFile(String bucketName, String key){
        try {
            if (conn.doesBucketExistV2(bucketName) == false) {
                return;
            }
            conn.deleteObject(bucketName, key);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
 
    /**
     * 下载文件
     * @param key
     * @param bucketName
     * @return
     * @throws Exception
     */
    public S3Object download(String key, String bucketName) throws Exception {
        S3Object obj = conn.getObject(bucketName, key);
        return obj;
    }
 
    /**
     * 生成url
     * @param bucketName
     * @param key
     * @param expires 单位:秒
     * @return
     */
    public String createUrl(String bucketName, String key, Integer expires){
        if(StringUtils.isEmpty(bucketName)){
            return key;
        }
        try {
            GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
            urlRequest.setExpiration(new Date(System.currentTimeMillis()+expires*1000));
            URL url = conn.generatePresignedUrl(urlRequest);
            return url.toString();
        }catch (Exception e){
            e.printStackTrace();
            return "";
        }catch (NoSuchFieldError noSuchFieldError){
            noSuchFieldError.printStackTrace();
            return "";
        }
    }
 
    /**
     * 创建桶
     * @param bucketName
     */
    public void creatBucket(String bucketName) {
        conn.createBucket(bucketName);
    }
 
    @PostConstruct
    public void creatConnect() {
        System.setProperty(SDKGlobalConfiguration.DISABLE_CERT_CHECKING_SYSTEM_PROPERTY, "true");
        System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY,
                "true");
        if (SDKGlobalConfiguration.isCertCheckingDisabled()) {
            System.out.println("Cert checking is disabled");
        }
        ClientConfiguration config = new ClientConfiguration();
        config.setSignerOverride("S3SignerType");
        config.setProtocol(Protocol.HTTP);
        if(isHttps(serviceEndpoint)) {
            config.setProtocol(Protocol.HTTPS);
        }
        config.setConnectionTimeout(30*1000);
        config.setMaxConnections(200);
        BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        AwsClientBuilder.EndpointConfiguration endpointConfiguration
                = new AwsClientBuilder.EndpointConfiguration(serviceEndpoint, "");
        conn = com.amazonaws.services.s3.AmazonS3ClientBuilder.standard()
                .withClientConfiguration(config)
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withEndpointConfiguration(endpointConfiguration)
                .withPathStyleAccessEnabled(isPathStyle)
                .build();
 
    }
 
    /**
     * 是否是https请求
     * @param serviceEndpoint
     * @return
     */
    private boolean isHttps(String serviceEndpoint){
        String tmpServiceEndpoint = serviceEndpoint.toUpperCase();
        if(tmpServiceEndpoint.startsWith(HTTPS_STR)){
            return true;
        }
        return false;
    }
 
    public String getBucketName(){
        return this.bucketName;
    }
}