JAVA整合腾讯COS实现文件上传

1、开通腾讯云对象存储服务
https://console.cloud.tencent.com/cos5
2、创建存储桶

3、密钥管理,新建密钥

4:在项目yml文件或者枚举类配置
tengxun:
cos:
SecretId: XXX
SecretKey: XXX
region: ap-shanghai
bucketName: XXX
url: XXX
path: XXX/XXX/ # 上传文件夹路径前缀
policy_expire: 300 # 签名有效期(S)
code_format: utf-8

   SecretId 是你生成的密钥ID,Key是密码,region是地区,url是访问域名,bucketName是桶名

以下是JAVA代码,拿来即用,web端访问controller即可

5:MAVEN添加配置

  <!--COS--><dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.54</version><scope>compile</scope></dependency>

1: TCCOSConfig类

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.region.Region;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.TransferManagerConfiguration;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** @author L_DY* @date 2022/5/6 15:00*/@Configuration
@Data
public class TCCOSConfig {@Value("${tengxun.cos.SecretId}")private String secretId;@Value("${tengxun.cos.SecretKey}")private String secretKey;@Value("${tengxun.cos.region}")private String region;@Value("${tengxun.cos.bucketName}")private String bucketName;@Value("${tengxun.cos.url}")private String url;@Value("${tengxun.cos.path}")private String path;@Value("${tengxun.cos.policy_expire}")public Integer policyExpire;@Value("${tengxun.cos.code_format}")public String codeFormat;@Bean// 创建 COSClient 实例public COSClient cosClient(){// 1 初始化用户身份信息(secretId, secretKey)。COSCredentials cred = new BasicCOSCredentials(this.secretId, this.secretKey);// 2 设置 bucket 的区域, COS 地域的简称请参照Region region = new Region(this.region);ClientConfig clientConfig = new ClientConfig(region);// 3 生成 cos 客户端。COSClient cosClient = new COSClient(cred, clientConfig);return cosClient;}// 创建 TransferManager 实例,这个实例用来后续调用高级接口public TransferManager createTransferManager() {// 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。COSClient cosClient = cosClient();// 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源// 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。ExecutorService threadPool = Executors.newFixedThreadPool(32);// 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。TransferManager transferManager = new TransferManager(cosClient, threadPool);// 设置高级接口的配置项// 分块上传阈值和分块大小分别为 5MB 和 1MBTransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);transferManager.setConfiguration(transferManagerConfiguration);return transferManager;}public void shutdownTransferManager(TransferManager transferManager) {transferManager.shutdownNow(false);}
}

2:PicUploadResult返回结果集

/**  返回结果集* @author L_DY* @date 2022/5/7 14:25*/
@Data
public class PicUploadResult {// 文件惟一标识private String uid;// 文件名private String name;// 状态有:uploading done error removedprivate String status;// 服务端响应内容,如:'{"status": "success"}'private String response;
}

3:ICosFileService

public interface ICosFileService {String uploadFile( MultipartFile file);String uploadFile(String fileName, InputStream inputStream);/*** 根据url上传* @param url* @return*/String uploadFileByUrl(String url);/*** 把html里的图片转存* @param content* @return*/String uploadImgFromHtml(String content);OssRecoverVO policy();String uploadFileWithFolder(String folder, MultipartFile uploadFile) throws IOException;}

4:CosFileServiceImpl

/*** @author L_DY* @date 2022/5/6 15:09*/
@Service
public class CosFileServiceImpl implements ICosFileService{@Autowiredprivate COSClient cosClient;@Autowiredprivate TCCOSConfig tccosConfig;//    视频后缀 校验视频格式public static final String VIDEO_SUFFIX = "wmv,avi,dat,asf,mpeg,mpg,rm,rmvb,ram,flv,mp4,3gp,mov,divx,dv,vob,mkv,qt,cpk,fli,flc,f4v,m4v,mod,m2t,swf,webm,mts,m2ts";//    图片格式public static final String IMG_SUFFIX = "jpg,png,jpeg,gif,svg";//    音频格式public static final String AUDIO_SUFFIX = "cda,wav,mp1,mp2,mp3,wma,vqf";@Overridepublic String uploadFile(MultipartFile file) {String url ="";try {url = uploadFile(Objects.requireNonNull(file.getOriginalFilename()),file.getInputStream());}catch (IOException e) {throw new CustomException("图片上传失败");}return url;}@Overridepublic String uploadFile(String fileName, InputStream inputStream) {String url = "";assert fileName != null;int split = fileName.lastIndexOf(".");// 文件后缀,用于判断上传的文件是否是合法的String suffix = fileName.substring(split+1);fileName = tccosConfig.getPath()+UuidShortUtil.creatShortUUID().toLowerCase() + "." + suffix;if(IMG_SUFFIX.contains(suffix) || VIDEO_SUFFIX.contains(suffix) || AUDIO_SUFFIX.contains(suffix)) {// 1 初始化用户身份信息(secretId, secretKey)。COSCredentials cred = new BasicCOSCredentials(tccosConfig.getSecretId(), tccosConfig.getSecretKey());// 2 设置 bucket 的区域, COS 地域的简称请参照Region region = new Region(this.tccosConfig.getRegion());ClientConfig clientConfig = new ClientConfig(region);// 3 生成 cos 客户端。COSClient cosClient = new COSClient(cred, clientConfig);// 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源// 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。ExecutorService threadPool = Executors.newFixedThreadPool(32);// 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。TransferManager transferManager = new TransferManager(cosClient, threadPool);// 设置高级接口的配置项// 分块上传阈值和分块大小分别为 5MB 和 1MBTransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);transferManager.setConfiguration(transferManagerConfiguration);String bucketName = tccosConfig.getBucketName();//储存桶名称PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream, new ObjectMetadata());try {Upload upload = transferManager.upload(putObjectRequest);//上传UploadResult uploadResult = upload.waitForUploadResult();uploadResult.getKey();//上传后的文件名字} catch (CosServiceException e) {e.printStackTrace();throw new CustomException("上传连接获取失败");} catch (CosClientException e) {e.printStackTrace();throw new CustomException("上传连接获取失败");} catch (InterruptedException e) {e.printStackTrace();throw new CustomException("上传连接获取失败");}finally {transferManager.shutdownNow(true);}url = tccosConfig.getUrl()+fileName;}else {//错误的类型,返回错误提示throw new CustomException("请选择正确的文件格式");}return url;}@Overridepublic String uploadFileByUrl(String url) {byte[] bytes;try {bytes = FileUtils.downloadPicture(url);}catch (Exception e){throw new CustomException("图片下载错误");}return uploadFile(UUID.randomUUID().toString()+".jpg",new ByteArrayInputStream(bytes));}@Overridepublic String uploadImgFromHtml(String content) {//判断content里是否有urlList<String> imgStrList = StringUtils.getImgStr(content);if(CollectionUtils.isEmpty(imgStrList)){return content;}for (String imgUrl : imgStrList) {if(imgUrl.startsWith(tccosConfig.getUrl())){continue;}content = content.replace(imgUrl,uploadFileByUrl(imgUrl));}return content;}@Overridepublic OssRecoverVO policy() {OssRecoverVO recoverVO = new OssRecoverVO();// 设置用户身份信息。// SECRETID 和 SECRETKEYString secretId = tccosConfig.getSecretId();String secretKey =tccosConfig.getSecretKey();COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// 存储桶String bucketName = tccosConfig.getBucketName();// 对象键(Key)是对象在存储桶中的唯一标识String key = "exampleobject";ClientConfig clientConfig = new ClientConfig(new Region(tccosConfig.getRegion()));// 用来生成签名COSSigner signer = new COSSigner();// 设置签名过期时间(可选),若未进行设置,则默认使用 ClientConfig 中的签名过期时间(1小时)long expireEndTime = System.currentTimeMillis() + tccosConfig.getPolicyExpire() * 1000;Date expiration = new Date(expireEndTime);// 填写本次请求的参数Map<String, String> params = new HashMap<String, String>();params.put("param1", "value1");// 填写本次请求的头部Map<String, String> headers = new HashMap<String, String>();// host 必填headers.put(Headers.HOST, clientConfig.getEndpointBuilder().buildGeneralApiEndpoint(bucketName));headers.put("header1", "value1");// 请求的 HTTP 方法,上传请求用 PUT,下载请求用 GET,删除请求用 DELETEHttpMethodName method = HttpMethodName.GET;String sign = signer.buildAuthorizationStr(method, key, headers, params, cred, expiration);String dir = tccosConfig.getPath() + expiration.getTime() + "_" + UUID.randomUUID().toString().substring(0, 8);// OSS accesskeyIdrecoverVO.setAccessid(secretId);// 协议/*  recoverVO.setPolicy();*/// 签名recoverVO.setSignature(sign);// 目录名字recoverVO.setDir(dir);// 提交地址recoverVO.setHost(tccosConfig.getUrl());// 到期时间recoverVO.setExpire(String.valueOf(expireEndTime / 1000));return recoverVO;}@Overridepublic String uploadFileWithFolder(String folder, MultipartFile uploadFile) throws IOException {if (Objects.isNull(uploadFile)){throw new CustomException(BusinessExceptionCodeEnums.PARAMS_ERROR);}String fileExtension = FileNameUtil.extName(uploadFile.getOriginalFilename());// 校验上传的格式boolean isLegal = false;// 封装Result对象,而且将文件的byte数组放置到result对象中if(IMG_SUFFIX.contains(fileExtension.toLowerCase()) || VIDEO_SUFFIX.contains(fileExtension.toLowerCase()) || AUDIO_SUFFIX.contains(fileExtension.toLowerCase())) {// 1 初始化用户身份信息(secretId, secretKey)。COSCredentials cred = new BasicCOSCredentials(tccosConfig.getSecretId(), tccosConfig.getSecretKey());// 2 设置 bucket 的区域, COS 地域的简称请参照Region region = new Region(tccosConfig.getRegion());ClientConfig clientConfig = new ClientConfig(region);// 3 生成 cos 客户端。COSClient cosClient = new COSClient(cred, clientConfig);// 文件新路径String fileName = uploadFile.getOriginalFilename();String filePath = tccosConfig.getPath()+folder+"/"+getFilePath(fileName);//上传文件try {// 指定要上传到的存储桶String bucketName = tccosConfig.getBucketName();// 指定要上传到 COS 上对象键String key = filePath;//这里的key是查找文件的依据,妥善保管cosClient.putObject(bucketName,key,new ByteArrayInputStream(uploadFile.getBytes()),null);//设置输出信息return tccosConfig.getUrl()+filePath;}catch (Exception e){e.printStackTrace();throw new CustomException("上传连接获取失败");}finally {// 关闭客户端(关闭后台线程)cosClient.shutdown();}}else {throw new CustomException("请选择正确的文件格式");}}/*** 生成文件路径* @param sourceFileName* @return*/private String getFilePath(String sourceFileName) {DateTime dateTime = new DateTime();return  System.currentTimeMillis() + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(sourceFileName, ".");}
}

5:CosFileController

/*** @author L_DY* @date 2022/5/6 15:32*/
@RestController
@RequestMapping("/ossUpload")
public class CosFileController {@Autowiredprivate ICosFileService cosFileService;@AnonymousAccess@PostMapping("/upload")@ResponseBodypublic AjaxResult uploadFile(MultipartFile file){return AjaxResult.success(cosFileService.uploadFile(file));}@AnonymousAccess@PostMapping("/uploadVideo")public AjaxResult uploadVideo( MultipartFile file) {AjaxResult ajax = AjaxResult.success();ajax.put("fileName", file.getOriginalFilename());ajax.put("url", cosFileService.uploadFile(file));return ajax;}@AnonymousAccess@PostMapping("/uploadFileByUrl")@ResponseBodypublic AjaxResult uploadFileByUrl(@RequestBody OssReq req){String url = cosFileService.uploadFileByUrl(req.getUrl());return AjaxResult.success(url);}@AnonymousAccess@PostMapping("/editor/upload")@ResponseBodypublic Object uploadFileWithFolder(@RequestParam("upload") MultipartFile file,@RequestParam(value = "folder",required = false,defaultValue = "editorUpload") String folder) throws IOException {String url = cosFileService.uploadFileWithFolder(folder, file);Map<String,Object> result = new HashMap<>();if (StringUtils.isNotEmpty(url)){result.put("uploaded",true);result.put("url",url);}else {result.put("uploaded",false);result.put("error",new HashMap<>().put("message","could not upload this image"));}return result;}/*** 签名生成*/@AnonymousAccess@PostMapping("/policy")@ResponseBodypublic AjaxResult policy() {return AjaxResult.success(cosFileService.policy());}}

JAVA整合腾讯COS(拿来即用)相关推荐

  1. Java整合腾讯云短信发送

    1. 引入相关maven依赖 <dependency><groupId>com.github.qcloudsms</groupId><artifactId&g ...

  2. springboot整合腾讯云cos对象储存

    一:腾讯云前期准备 直接在腾讯云中搜索"对象存储",立即使用 点击存储桶列表,创建存储桶 填写基本信息:所属地域,名称,访问权限(公有读写) 下一步,下一步,创建,存储桶创建成功 ...

  3. java集成腾讯云COS

    @RequestMapping(value = "/test", method = RequestMethod.POST)@ResponseBodypublic String te ...

  4. 腾讯直播与 JAVA整合_JAVA对接腾讯云直播如何实现 JAVA对接腾讯云直播实现代码...

    JAVA对接腾讯云直播如何实现?本篇文章小编给大家分享一下JAVA对接腾讯云直播实现代码,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 签名授权 public static ...

  5. 硅谷课堂 06_整合腾讯云对象存储和课程分类管理

    硅谷课堂第六天-整合腾讯云对象存储和课程分类管理 文章目录 硅谷课堂第六天-整合腾讯云对象存储和课程分类管理 一.讲师管理模块整合腾讯云对象存储 1.腾讯云对象存储介绍 1.1.开通"对象存 ...

  6. Java对接腾讯智慧校园开放平台,idea完整项目

    Java对接腾讯智慧校园开放平台,直接上代码. 关键代码如下: public class Sign {private static final char[] HEXES = {'0', '1', '2 ...

  7. kettle清洗mysql数据_ETL工具Kettle使用以及与Java整合实现数据清洗

    本文主要讲述kettle的使用和与Java整合,具体下载与安装请自行百度! kettle有两种脚本方式:转换和工作,工作中可以添加转换.以下以转换为例. 1.新建一个转换, 2.在工作中经常用到的是表 ...

  8. Java对接腾讯IM以及一些方法的简单封装

    一. 腾讯IM快速入门 1. 注册腾讯云账号,找到即时通信IM控制台 腾讯IM控制台:https://console.cloud.tencent.com/im 2. 创建即时通信应用 3. 进到应用里 ...

  9. BT宝塔面板设置网站自动云备份——备份到七牛云或腾讯COS

    宝塔面板支持多种云存储方式,目前我只测试了七牛云存储和腾讯COS,所以仅做一下关于这两个的笔记. 安装软件 在宝塔面板的"软件管理"中,搜索"存储",在搜索结果 ...

最新文章

  1. 日常记录-Pandas Cookbook
  2. Android开发环境搭建及常见问题解决方法
  3. Android中基于TCP协议的网络通信之使用Socket进行通信
  4. 【2018年11月21日】煤炭行业的估值高度排名
  5. linux终端vim底行模式点冒号,Vim基本使用方法
  6. 【java】System.getProperty()参数大全
  7. Flink解析kafka canal未压平数据为message报错
  8. 还在用Excel做数据分析?两大方法5分钟完成别人一天的工作
  9. [分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)
  10. 她是法国数学界的“花木兰”,高斯的“救命恩人”
  11. Swift iOS : 内存管理
  12. 开机时不输入用户名密码直接登录
  13. java正则表达式版本_java 正则表达式 版本号_java正则表达式?=.*_密码的正则表达式java...
  14. ecshop内页显示最新文章
  15. 数据库:实验五MySQL数据库对象-(视图、索引)
  16. 实现从淘宝(天猫)定时抓取订单数据、打印电子面单并保存到ERP表中
  17. Tensorflow2.6实现Unet结构神经网络(3D卷积)识别脑部肿瘤并实现模型并行
  18. 【Ice】【01】linux 安装ice
  19. Android视频编码--H264编码
  20. Jmeter-Beanshell取样器举例描述常用方法及使用场景

热门文章

  1. 几分钟上线一个网站,这些神器我爱了
  2. oracle minus 是什么意思,oracle minus用法
  3. 猴年快乐! 在UI设计中解密农历新年的象征意义
  4. 12【源码】数据可视化:基于 Echarts +Java SpringBoot 实现的动态实时大屏范例 - 供应链
  5. (转帖)石康亵渎了80后的奋斗
  6. 初学者奇怪的迷惑点:CTR模式,做实验的时候nonce的取值为啥啊固定?
  7. python polygon_Polygon
  8. Node.js + Socket.io 实现一对一即时聊天
  9. 6.3 由学得用——《逆袭大学》连载
  10. [转贴]迅雷十年反思