yangys
2024-05-30 a3686cfa49bf53fb91a2ceb960cf15b3ebdac641
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
package com.qianwen.core.oss;
 
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PolicyConditions;
import com.aliyun.oss.model.PutObjectResult;
import java.io.InputStream;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.qianwen.core.oss.model.BladeFile;
import com.qianwen.core.oss.model.OssFile;
import com.qianwen.core.oss.props.OssProperties;
import com.qianwen.core.oss.rule.OssRule;
import com.qianwen.core.tool.jackson.JsonUtil;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
 
public class AliossTemplate implements OssTemplate {
    private final OSSClient ossClient;
    private final OssProperties ossProperties;
    private final OssRule ossRule;
 
    public AliossTemplate(final OSSClient ossClient, final OssProperties ossProperties, final OssRule ossRule) {
        this.ossClient = ossClient;
        this.ossProperties = ossProperties;
        this.ossRule = ossRule;
    }
 
    @Override 
    public void makeBucket(String bucketName) {
        if (!bucketExists(bucketName)) {
            this.ossClient.createBucket(getBucketName(bucketName));
        }
    }
 
    @Override 
    public void removeBucket(String bucketName) {
        this.ossClient.deleteBucket(getBucketName(bucketName));
    }
 
    @Override 
    public boolean bucketExists(String bucketName) {
        return this.ossClient.doesBucketExist(getBucketName(bucketName));
    }
 
    @Override 
    public void copyFile(String bucketName, String fileName, String destBucketName) {
        this.ossClient.copyObject(getBucketName(bucketName), fileName, getBucketName(destBucketName), fileName);
    }
 
    @Override 
    public void copyFile(String bucketName, String fileName, String destBucketName, String destFileName) {
        this.ossClient.copyObject(getBucketName(bucketName), fileName, getBucketName(destBucketName), destFileName);
    }
 
    @Override 
    public OssFile statFile(String fileName) {
        return statFile(this.ossProperties.getBucketName(), fileName);
    }
 
    @Override 
    public OssFile statFile(String bucketName, String fileName) {
        ObjectMetadata stat = this.ossClient.getObjectMetadata(getBucketName(bucketName), fileName);
        OssFile ossFile = new OssFile();
        ossFile.setName(fileName);
        ossFile.setLink(fileLink(ossFile.getName()));
        ossFile.setHash(stat.getContentMD5());
        ossFile.setLength(stat.getContentLength());
        ossFile.setPutTime(stat.getLastModified());
        ossFile.setContentType(stat.getContentType());
        return ossFile;
    }
 
    @Override 
    public String filePath(String fileName) {
        return getOssHost().concat("/").concat(fileName);
    }
 
    @Override 
    public String filePath(String bucketName, String fileName) {
        return getOssHost(bucketName).concat("/").concat(fileName);
    }
 
    @Override 
    public String fileLink(String fileName) {
        return getOssHost().concat("/").concat(fileName);
    }
 
    @Override 
    public String fileLink(String bucketName, String fileName) {
        return getOssHost(bucketName).concat("/").concat(fileName);
    }
 
    @Override 
    public InputStream getObject(String bucketName, String fileName, Long offset, Long length) {
        return get(bucketName, fileName, offset, length);
    }
 
    @Override 
    public InputStream getObject(String fileName, Long offset, Long length) {
        return get(this.ossProperties.getBucketName(), fileName, offset, length);
    }
 
    @Override 
    public InputStream getObject(String bucketName, String fileName) {
        return get(bucketName, fileName);
    }
 
    @Override 
    public InputStream getObject(String fileName) {
        return get(this.ossProperties.getBucketName(), fileName);
    }
 
    @Override 
    public BladeFile putFile(MultipartFile file) {
        return putFile(this.ossProperties.getBucketName(), file.getOriginalFilename(), file);
    }
 
    @Override 
    public BladeFile putFile(String fileName, MultipartFile file) {
        return putFile(this.ossProperties.getBucketName(), fileName, file);
    }
 
    @Override 
    public BladeFile putFile(String bucketName, String fileName, MultipartFile file) {
        try {
            return putFile(bucketName, fileName, file.getInputStream());
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
 
    @Override 
    public BladeFile putFile(String fileName, InputStream stream) {
        return putFile(this.ossProperties.getBucketName(), fileName, stream);
    }
 
    @Override 
    public BladeFile putFile(String bucketName, String fileName, InputStream stream) {
        return put(bucketName, stream, fileName, false);
    }
 
    public BladeFile put(String bucketName, InputStream stream, String key, boolean cover) {
        makeBucket(bucketName);
        String key2 = getFileName(key);
        if (cover) {
            this.ossClient.putObject(getBucketName(bucketName), key2, stream);
        } else {
            PutObjectResult response = this.ossClient.putObject(getBucketName(bucketName), key2, stream);
            for (int retry = 0; StringUtils.isEmpty(response.getETag()) && retry < 5; retry++) {
                response = this.ossClient.putObject(getBucketName(bucketName), key2, stream);
            }
        }
        BladeFile file = new BladeFile();
        file.setOriginalName(key);
        file.setName(key2);
        file.setDomain(getOssHost(bucketName));
        file.setLink(fileLink(bucketName, key2));
        return file;
    }
 
    public InputStream get(String bucketName, String key) {
        OSSObject ossObject = this.ossClient.getObject(getBucketName(bucketName), key);
        return ossObject.getObjectContent();
    }
 
    public InputStream get(String bucketName, String key, Long offset, Long length) {
        GetObjectRequest getObjectRequest = new GetObjectRequest(getBucketName(bucketName), key);
        getObjectRequest.setRange(offset.longValue(), new BigDecimal(offset.longValue()).add(new BigDecimal(length.longValue())).longValue());
        OSSObject ossObject = this.ossClient.getObject(getObjectRequest);
        return ossObject.getObjectContent();
    }
 
    @Override 
    public void removeFile(String fileName) {
        this.ossClient.deleteObject(getBucketName(), fileName);
    }
 
    @Override 
    public void removeFile(String bucketName, String fileName) {
        this.ossClient.deleteObject(getBucketName(bucketName), fileName);
    }
 
    @Override 
    public void removeFiles(List<String> fileNames) {
        fileNames.forEach(this::removeFile);
    }
 
    @Override 
    public void removeFiles(String bucketName, List<String> fileNames) {
        fileNames.forEach(fileName -> {
            removeFile(getBucketName(bucketName), fileName);
        });
    }
 
    private String getBucketName() {
        return getBucketName(this.ossProperties.getBucketName());
    }
 
    private String getBucketName(String bucketName) {
        return this.ossRule.bucketName(bucketName);
    }
 
    private String getFileName(String originalFilename) {
        return this.ossRule.fileName(originalFilename);
    }
 
    public String getUploadToken() {
        return getUploadToken(this.ossProperties.getBucketName());
    }
 
    public String getUploadToken(String bucketName) {
        return getUploadToken(bucketName, ((Long) this.ossProperties.getArgs().get("expireTime", 3600L)).longValue());
    }
 
    public String getUploadToken(String bucketName, long expireTime) {
        long expireEndTime = System.currentTimeMillis() + (expireTime * 1000);
        Date expiration = new Date(expireEndTime);
        PolicyConditions policyConds = new PolicyConditions();
        policyConds.addConditionItem("content-length-range", 0L, ((Integer) this.ossProperties.getArgs().get("contentLengthRange", 10485760)).intValue());
        policyConds.addConditionItem(MatchMode.StartWith, "key", "upload");
        String postPolicy = this.ossClient.generatePostPolicy(expiration, policyConds);
        byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
        String encodedPolicy = BinaryUtil.toBase64String(binaryData);
        String postSignature = this.ossClient.calculatePostSignature(postPolicy);
        Map<String, String> respMap = new LinkedHashMap<>(16);
        respMap.put("accessid", this.ossProperties.getAccessKey());
        respMap.put("policy", encodedPolicy);
        respMap.put("signature", postSignature);
        respMap.put("dir", "upload");
        respMap.put("host", getOssHost(bucketName));
        respMap.put("expire", String.valueOf(expireEndTime / 1000));
        return JsonUtil.toJson(respMap);
    }
 
    public String getOssHost(String bucketName) {
        String prefix = this.ossProperties.getEndpoint().contains("https://") ? "https://" : "http://";
        return prefix + getBucketName(bucketName) + "." + this.ossProperties.getEndpoint().replaceFirst(prefix, "");
    }
 
    public String getOssHost() {
        return getOssHost(this.ossProperties.getBucketName());
    }
}