chenjiahe
2022-07-12 cd5e48b7aa68c555e77402832bc84e87a47853ad
src/main/java/com/hx/util/COSUtil.java
@@ -1,22 +1,26 @@
package com.hx.util;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
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.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**腾讯云 COS
 * @author ChenJiaHe
@@ -109,4 +113,130 @@
   }
   /**下载文件
    * @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);
   }
}