add
yj
2024-12-05 b9900893177c78fc559223521fe839aa21000017
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
package com.dobbinsoft.fw.support.storage;
 
import com.dobbinsoft.fw.support.properties.FwObjectStorageProperties;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
 
import java.util.Date;
 
/**
 * ClassName: QCloudStorageClient
 * Description: 腾讯云对象存储客户端
 *
 * @author: e-weichaozheng
 * @date: 2021-03-17
 */
public class QCloudStorageClient implements StorageClient, InitializingBean {
 
    @Autowired
    private FwObjectStorageProperties properties;
 
    private COSClient cosClient;
 
    @Override
    public void afterPropertiesSet() throws Exception {
        COSCredentials cred = new BasicCOSCredentials(properties.getQcloudSecretId(), properties.getQcloudSecretKey());
        // 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(properties.getQcloudRegion());
        ClientConfig clientConfig = new ClientConfig(region);
        this.cosClient = new COSClient(cred, clientConfig);
    }
 
    @Override
    public StorageResult save(StorageRequest request) {
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(request.getSize());
        objectMetadata.setContentType(request.getContentType());
        PutObjectRequest putObjectRequest = new PutObjectRequest(
                properties.getQcloudBucket(),
                request.getPath() + "/" + request.getFilename(),
                request.getIs(), objectMetadata);
        cosClient.putObject(putObjectRequest);
        StorageResult result = new StorageResult();
        result.setSuc(true);
        result.setUrl(properties.getQcloudBaseUrl() + "/" + request.getPath() + "/" + request.getFilename());
        return result;
    }
 
    @Override
    public StoragePrivateResult savePrivate(StorageRequest request) {
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(request.getSize());
        objectMetadata.setContentType(request.getContentType());
        PutObjectRequest putObjectRequest = new PutObjectRequest(
                properties.getQcloudBucket(),
                request.getPath() + "/" + request.getFilename(),
                request.getIs(), objectMetadata);
        cosClient.putObject(putObjectRequest);
        String key = request.getPath() + "/" + request.getFilename();
        cosClient.setObjectAcl(this.properties.getQcloudBucket(), key, CannedAccessControlList.Private);
        StoragePrivateResult result = new StoragePrivateResult();
        result.setSuc(true);
        result.setKey(key);
        result.setUrl(this.getPrivateUrl(key, 120));
        return result;
    }
 
    @Override
    public boolean delete(String url) {
        int index = url.indexOf("/", 5);
        String key = url.substring(index);
        cosClient.deleteObject(properties.getQcloudBucket(), key);
        return true;
    }
 
    @Override
    public boolean deletePrivate(String key) {
        cosClient.deleteObject(properties.getQcloudBucket(), key);
        return true;
    }
 
    @Override
    public String getPrivateUrl(String key, Integer expireSec) {
        return cosClient.generatePresignedUrl(properties.getQcloudBucket(), key, new Date(System.currentTimeMillis() + (1000L * expireSec))).toString();
    }
 
    @Override
    public String getKeyFormUrl(String url) {
        if (url.startsWith("http")) {
            url = url.replace("http://", "").replace("https://", "");
            int index = url.indexOf("/");
            String substring = url.substring(index + 1);
            int endIndex = substring.indexOf("?");
            if (endIndex > 0) {
                return substring.substring(0, endIndex);
            } else {
                return substring;
            }
        } else {
            return url;
        }
    }
 
}