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;
|
System.out.println("key:"+key);
|
System.out.println("bucketName:"+bucketName);
|
System.out.println("regionName:"+regionName);
|
System.out.println("regionName:"+regionName+".myqcloud.com");
|
//截取文件名称
|
String[] datas = key.split(regionName+".myqcloud.com/");
|
if(datas.length ==1){
|
getObjectRequest = new GetObjectRequest(bucketName, datas[0]);
|
}else if(datas.length ==2){
|
System.out.println("datas[1]:"+datas[1]);
|
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);
|
}
|
|
|
}
|