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); } }