chenjiahe
2023-07-17 d4fa5269e214e8bbe1f7dd79a922cefe9fc9916b
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
package com.hx.util;
 
import com.hx.exception.TipsException;
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.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.GetObjectRequest;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.Download;
import com.qcloud.cos.transfer.TransferManager;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**腾讯云 COS
 * @author ChenJiaHe
 * @date 2020-12-03
 */
public class COSUtil {
 
    /** 后端调用上传图片
     * @param key 上传路径(包括图片名称和和后缀),指定要上传到 COS 上对象键
     * @param localFile
     * @param secretId 用户id
     * @param secretKey 用户秘钥
     * @param regionName 存在域,参考腾讯云
     * @param bucketName 指定要上传到的存储桶
     * @return
     * @throws IOException
     */
    public static String uploadImg(String key,MultipartFile localFile,String secretId, String secretKey,String regionName,String bucketName) throws IOException {
 
        // 1 初始化用户身份信息(secretId, secretKey)。
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2 设置 bucket 的区域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(regionName);
        ClientConfig clientConfig = new ClientConfig(region);
        // 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);
 
        //开始上传
        ObjectMetadata objectMetadata = new ObjectMetadata();
        // 设置输入流长度为500
        objectMetadata.setContentLength(localFile.getSize());
        // 设置 Content type, 默认是 application/octet-stream,对于本地文件上传,默认根据本地文件的后缀进行映射
        // ,例如 jpg 文件映射 为image/jpeg对于流式上传 默认是 application/octet-stream
        //objectMetadata.setContentType("application/pdf");
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key,localFile.getInputStream(),objectMetadata);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
 
        //拼接路径
        StringBuilder imgUrl = new StringBuilder();
        imgUrl.append("https://"+bucketName+".cos."+regionName+".myqcloud.com");
        if(key.startsWith("/")){
            imgUrl.append(key);
        }else{
            imgUrl.append("/"+key);
        }
        cosClient.shutdown();
        return imgUrl.toString();
 
    }
 
 
    /** 后端调用上传图片
     * @param key 上传路径(包括图片名称和和后缀),指定要上传到 COS 上对象键
     * @param localFile
     * @param secretId 用户id
     * @param secretKey 用户秘钥
     * @param regionName 存在域,参考腾讯云
     * @param bucketName 指定要上传到的存储桶
     * @return
     * @throws IOException
     */
    public static String uploadImg(String key,File localFile,String secretId, String secretKey,String regionName,String bucketName) throws IOException {
 
        // 1 初始化用户身份信息(secretId, secretKey)。
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2 设置 bucket 的区域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(regionName);
        ClientConfig clientConfig = new ClientConfig(region);
        // 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);
 
        // 设置 Content type, 默认是 application/octet-stream,对于本地文件上传,默认根据本地文件的后缀进行映射
        // ,例如 jpg 文件映射 为image/jpeg对于流式上传 默认是 application/octet-stream
        //objectMetadata.setContentType("application/pdf");
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
 
        //拼接路径
        StringBuilder imgUrl = new StringBuilder();
        imgUrl.append("https://"+bucketName+".cos."+regionName+".myqcloud.com");
        if(key.startsWith("/")){
            imgUrl.append(key);
        }else{
            imgUrl.append("/"+key);
        }
        cosClient.shutdown();
        return imgUrl.toString();
 
    }
 
    /**下载文件
     * @param key 上传路径(包括图片名称和和后缀),指定要上传到 COS 上对象键
     * @param secretId 用户id
     * @param secretKey 用户秘钥
     * @param regionName 存在域,参考腾讯云
     * @param bucketName 指定要上传到的存储桶
     */
    public static File download(String key,String secretId, String secretKey,String regionName,String bucketName){
 
        // 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建
        // 详细代码参见本页:高级接口 -> 创建 TransferManager
        TransferManager transferManager = createTransferManager( secretId, secretKey,regionName);
        // 本地文件路径
        File downloadFile = null;
        try {
            GetObjectRequest getObjectRequest;
            //截取文件名称
            String[] datas = key.split(regionName+".myqcloud.com/");
            if(datas.length ==1){
                getObjectRequest = new GetObjectRequest(bucketName, datas[0]);
            }else if(datas.length ==2){
                getObjectRequest = new GetObjectRequest(bucketName, datas[1]);
            }else{
                throw new TipsException("文件路径错误【key】");
            }
 
            ////生成临时文件
            //获取后缀名称
            String suffix = key.substring(key.lastIndexOf("."));
            downloadFile = File.createTempFile("temp", suffix);
 
            // 返回一个异步结果 Donload, 可同步的调用 waitForCompletion 等待下载结束, 成功返回 void, 失败抛出异常
            Download download = transferManager.download(getObjectRequest, downloadFile);
            download.waitForCompletion();
        } catch (CosServiceException e) {
            e.printStackTrace();
        } catch (CosClientException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            // 确定本进程不再使用 transferManager 实例之后,关闭之
            // 详细代码参见本页:高级接口 -> 关闭 TransferManager
            shutdownTransferManager(transferManager);
        }
 
        return downloadFile;
    }
 
    /**
     * 创建 TransferManager 实例,这个实例用来后续调用高级接口
     * @param secretId
     * @param secretKey
     * @return
     */
    public static TransferManager createTransferManager(String secretId, String secretKey,String regionName) {
        // 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。
        // 详细代码参见本页: 简单操作 -> 创建 COSClient
        COSClient cosClient = createCOSClient( secretId, secretKey,regionName);
 
        // 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源
        // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。
        ExecutorService threadPool = Executors.newFixedThreadPool(32);
 
        // 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。
        TransferManager transferManager = new TransferManager(cosClient, threadPool);
 
        return transferManager;
    }
 
    /**
     * 关闭管理
     * @param transferManager
     */
    public static void shutdownTransferManager(TransferManager transferManager) {
        // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。
        // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。
        transferManager.shutdownNow(true);
    }
 
    /**
     *  创建 COSClient 实例,这个实例用来后续调用请求
     * @param secretId
     * @param secretKey
     * @return
     */
    public static COSClient createCOSClient(String secretId, String secretKey,String regionName) {
        // 设置用户身份信息。
        // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
 
        // ClientConfig 中包含了后续请求 COS 的客户端设置:
        ClientConfig clientConfig = new ClientConfig();
 
        // 设置 bucket 的地域
        // COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
        clientConfig.setRegion(new Region(regionName));
 
        // 设置请求协议, http 或者 https
        // 5.6.53 及更低的版本,建议设置使用 https 协议
        // 5.6.54 及更高版本,默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);
 
        // 以下的设置,是可选的:
 
        // 设置 socket 读取超时,默认 30s
        clientConfig.setSocketTimeout(300*1000);
        // 设置建立连接超时,默认 30s
        clientConfig.setConnectionTimeout(30*1000);
 
        // 如果需要的话,设置 http 代理,ip 以及 port
        //clientConfig.setHttpProxyIp("httpProxyIp");
        //clientConfig.setHttpProxyPort(80);
 
        // 生成 cos 客户端。
        return new COSClient(cred, clientConfig);
    }
 
 
}