1.腾讯云cos介绍

对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景

2.JavaSDK方式使用

1.引入依赖

使用maven在pom.xml引入依赖

  1. <!-- 腾讯云cos-->
  2. <dependency>
  3. <groupId>com.qcloud</groupId>
  4. <artifactId>cos_api</artifactId>
  5. </dependency>

2.编写配置文件

将配置项写在application.yml中,再由spring注入到常量类中,具体配置内容查看腾讯云cos控制台和产品文档

  1. qclound:
  2. cos:
  3. file:
  4. #腾讯云cos的id
  5. secretId: xxxxxxxxxxxxxxxx
  6. #腾讯云cos的密码
  7. secretKey: xxxxxxxxxxxxxxxxxxxxxxxx
  8. #腾讯云cos的地域
  9. region: ap-chengdu
  10. #腾讯云储存桶的名字
  11. bucket: guli-college-1258905932

3.创建 COSClient 实例,这个实例用来后续调用请求

代码来自腾讯云cos的javaJDK示例文档

  1. /**
  2. * 1.创建 COSClient 实例,这个实例用来后续调用请求
  3. *
  4. * @return COSClient实例
  5. */
  6. private COSClient createCOSClient() {
  7. // 设置用户身份信息。
  8. // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
  9. String secretId = ConstandPropertiesUtils.SECRET_ID;
  10. String secretKey = ConstandPropertiesUtils.SECRET_KEY;
  11. COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
  12. // ClientConfig 中包含了后续请求 COS 的客户端设置:
  13. ClientConfig clientConfig = new ClientConfig();
  14. // 设置 bucket 的地域
  15. // COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
  16. clientConfig.setRegion(new Region(ConstandPropertiesUtils.REGION));
  17. // 设置请求协议, http 或者 https
  18. // 5.6.53 及更低的版本,建议设置使用 https 协议
  19. // 5.6.54 及更高版本,默认使用了 https
  20. clientConfig.setHttpProtocol(HttpProtocol.https);
  21. // 以下的设置,是可选的:
  22. // 设置 socket 读取超时,默认 30s
  23. clientConfig.setSocketTimeout(30 * 1000);
  24. // 设置建立连接超时,默认 30s
  25. clientConfig.setConnectionTimeout(30 * 1000);
  26. // 如果需要的话,设置 http 代理,ip 以及 port
  27. // clientConfig.setHttpProxyIp("httpProxyIp");
  28. // clientConfig.setHttpProxyPort(80);
  29. // 生成 cos 客户端。
  30. return new COSClient(cred, clientConfig);
  31. }

4.上传文件至COS

这里是小文件上传,大文件推荐使用流的方式,MultipartFile类型是前端接口传入的类型

  1. /**
  2. * 2.流式上传文件到腾讯云cos,代码不需要写,复制他的示例修改就好
  3. *
  4. * @param file
  5. * @return 文件的上传路径
  6. */
  7. @Override
  8. public String uploadAvatar(MultipartFile file) {
  9. // 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
  10. // 详细代码参见本页:简单操作 -> 创建 COSClient
  11. COSClient cosClient = createCOSClient();
  12. // 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
  13. String bucketName = ConstandPropertiesUtils.BUCKET_NAME;
  14. // 对象键(Key)是对象在存储桶中的唯一标识,这里设置为文件名+UUID
  15. String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  16. String key = uuid + file.getOriginalFilename();
  17. //获取当前日期,用于把上传的文件按照日期分类,cos会自动创建对应的文件夹
  18. String date = new DateTime().toString("yyyy/MM/dd");
  19. key = date + "/" + key;
  20. // 2022/03/24/03c15e03e30d49dcb0a57f77d075899enewYear.jpg
  21. System.out.println(key);
  22. //这里应该是您要上传的 InputStream 类型的流
  23. InputStream inputStream = null;
  24. try {
  25. inputStream = file.getInputStream();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. ObjectMetadata objectMetadata = new ObjectMetadata();
  30. // 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length
  31. // 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了
  32. // objectMetadata.setContentLength(inputStreamLength);
  33. //上传,args:储存桶名,对象键,文件流
  34. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);
  35. String url = null;
  36. try {
  37. PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
  38. //使用腾讯云的api获得对象key的路径
  39. url = cosClient.getObjectUrl(bucketName, key).toString();
  40. System.out.println(putObjectResult.getRequestId());
  41. } catch (CosClientException e) {
  42. e.printStackTrace();
  43. } finally {
  44. cosClient.shutdown();
  45. }
  46. return url;
  47. }

5.删除COS中指定文件

url通过前端返回

  1. //上传成功回调,返回图片地址,这里的data是ImageCropper帮我们上传之后封装返回的
  2. cropSuccess(data) {
  3. console.log(data)
  4. this.close()
  5. this.teacher.avatar = data.url
  6. },
  1. //删除已经上传到cos的头像文件
  2. removeAvatar() {
  3. let index =this.teacher.avatar.lastIndexOf('/')
  4. let photoName= this.teacher.avatar.substring(index+1)
  5. //当没有点击最后的保存按钮并且图片名不为默认图片时执行删除,以免误删除
  6. if (this.isDetermineSave === false && photoName!=="default.png") {
  7. eduTeacher.removeAvatar(this.teacher.avatar)
  8. }
  9. }
  1. /**
  2. * 删除COS中的文件
  3. * @param url
  4. * @return
  5. */
  6. @Override
  7. public Boolean deleteAvatar(String url) {
  8. if (StringUtils.isNullOrEmpty(url)) {
  9. return false;
  10. }
  11. // 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
  12. COSClient cosClient = createCOSClient();
  13. // 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
  14. String bucketName = ConstandPropertiesUtils.BUCKET_NAME;
  15. // "https://guli-college-1258905932.cos.ap-chengdu.myqcloud.com/2022/03/24/69d5e43fd2444d978d114bb1136b6f45file.png"
  16. int index = url.indexOf("myqcloud.com/");
  17. //因为myqcloud.com/长13,要从它后面开始截取
  18. String key = url.substring(index + 13);
  19. log.info("要删除的对象名:" + key);
  20. try {
  21. cosClient.deleteObject(bucketName, key);
  22. cosClient.shutdown();
  23. return true;
  24. } catch (CosClientException e) {
  25. e.printStackTrace();
  26. } finally {
  27. // 确认本进程不再使用 cosClient 实例之后,关闭之
  28. cosClient.shutdown();
  29. }
  30. return false;
  31. }