1.腾讯云cos介绍
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景
2.JavaSDK方式使用
1.引入依赖
使用maven在pom.xml引入依赖
<!-- 腾讯云cos--><dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId></dependency>
2.编写配置文件
将配置项写在application.yml中,再由spring注入到常量类中,具体配置内容查看腾讯云cos控制台和产品文档
qclound:cos:file:#腾讯云cos的idsecretId: xxxxxxxxxxxxxxxx#腾讯云cos的密码secretKey: xxxxxxxxxxxxxxxxxxxxxxxx#腾讯云cos的地域region: ap-chengdu#腾讯云储存桶的名字bucket: guli-college-1258905932
3.创建 COSClient 实例,这个实例用来后续调用请求
代码来自腾讯云cos的javaJDK示例文档
/*** 1.创建 COSClient 实例,这个实例用来后续调用请求** @return COSClient实例*/private COSClient createCOSClient() {// 设置用户身份信息。// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理String secretId = ConstandPropertiesUtils.SECRET_ID;String secretKey = ConstandPropertiesUtils.SECRET_KEY;COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// ClientConfig 中包含了后续请求 COS 的客户端设置:ClientConfig clientConfig = new ClientConfig();// 设置 bucket 的地域// COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224clientConfig.setRegion(new Region(ConstandPropertiesUtils.REGION));// 设置请求协议, http 或者 https// 5.6.53 及更低的版本,建议设置使用 https 协议// 5.6.54 及更高版本,默认使用了 httpsclientConfig.setHttpProtocol(HttpProtocol.https);// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30sclientConfig.setSocketTimeout(30 * 1000);// 设置建立连接超时,默认 30sclientConfig.setConnectionTimeout(30 * 1000);// 如果需要的话,设置 http 代理,ip 以及 port// clientConfig.setHttpProxyIp("httpProxyIp");// clientConfig.setHttpProxyPort(80);// 生成 cos 客户端。return new COSClient(cred, clientConfig);}
4.上传文件至COS
这里是小文件上传,大文件推荐使用流的方式,MultipartFile类型是前端接口传入的类型
/*** 2.流式上传文件到腾讯云cos,代码不需要写,复制他的示例修改就好** @param file* @return 文件的上传路径*/@Overridepublic String uploadAvatar(MultipartFile file) {// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = ConstandPropertiesUtils.BUCKET_NAME;// 对象键(Key)是对象在存储桶中的唯一标识,这里设置为文件名+UUIDString uuid = UUID.randomUUID().toString().replaceAll("-", "");String key = uuid + file.getOriginalFilename();//获取当前日期,用于把上传的文件按照日期分类,cos会自动创建对应的文件夹String date = new DateTime().toString("yyyy/MM/dd");key = date + "/" + key;// 2022/03/24/03c15e03e30d49dcb0a57f77d075899enewYear.jpgSystem.out.println(key);//这里应该是您要上传的 InputStream 类型的流InputStream inputStream = null;try {inputStream = file.getInputStream();} catch (IOException e) {e.printStackTrace();}ObjectMetadata objectMetadata = new ObjectMetadata();// 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length// 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了// objectMetadata.setContentLength(inputStreamLength);//上传,args:储存桶名,对象键,文件流PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);String url = null;try {PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);//使用腾讯云的api获得对象key的路径url = cosClient.getObjectUrl(bucketName, key).toString();System.out.println(putObjectResult.getRequestId());} catch (CosClientException e) {e.printStackTrace();} finally {cosClient.shutdown();}return url;}
5.删除COS中指定文件
url通过前端返回
//上传成功回调,返回图片地址,这里的data是ImageCropper帮我们上传之后封装返回的cropSuccess(data) {console.log(data)this.close()this.teacher.avatar = data.url},
//删除已经上传到cos的头像文件removeAvatar() {let index =this.teacher.avatar.lastIndexOf('/')let photoName= this.teacher.avatar.substring(index+1)//当没有点击最后的保存按钮并且图片名不为默认图片时执行删除,以免误删除if (this.isDetermineSave === false && photoName!=="default.png") {eduTeacher.removeAvatar(this.teacher.avatar)}}
/*** 删除COS中的文件* @param url* @return*/@Overridepublic Boolean deleteAvatar(String url) {if (StringUtils.isNullOrEmpty(url)) {return false;}// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建COSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = ConstandPropertiesUtils.BUCKET_NAME;// "https://guli-college-1258905932.cos.ap-chengdu.myqcloud.com/2022/03/24/69d5e43fd2444d978d114bb1136b6f45file.png"int index = url.indexOf("myqcloud.com/");//因为myqcloud.com/长13,要从它后面开始截取String key = url.substring(index + 13);log.info("要删除的对象名:" + key);try {cosClient.deleteObject(bucketName, key);cosClient.shutdown();return true;} catch (CosClientException e) {e.printStackTrace();} finally {// 确认本进程不再使用 cosClient 实例之后,关闭之cosClient.shutdown();}return false;}
