普通名目开发中都会有文件、图片、视频等文件上行并能够访问的场景。要成功这样的场景,要么把文件存储在运行主机上,要么搭建文件服务来存储。由于我的是腾讯云的主机,所以就间接申请了腾讯云的COS对象存储。这篇文章就来记载一下,SpringBoot整合腾讯云COS对象存储成功文件上行的。整合前须要做一些预备上班,申请COS对象存储,创立存储通,创立访问密钥。申请腾讯云对象存储服务
上行文件到腾讯云主机,上行文件时总是产生主机无照应
2023-06-02分类:聚合分类评论(0)
前言
嗨,大家好,我是希留,一个自愿努力于全栈开发的老菜鸟。
普通名目开发中都会有文件、图片、视频等文件上行并能够访问的场景。要成功这样的场景,要么把文件存储在运行主机上,要么搭建文件服务来存储。然而这两种模式也有不少的缺陷,参与运维的老本。
因此,谋求用户体验的名目或许会思考经常使用第三方的云服务来成功存储,目前市场上干流的厂商有:七牛云、阿里云OSS、腾讯云COS等,详细驳回哪种存储打算还需联合名目标规模、老本等起因,综合考量。
由于我的是腾讯云的主机,所以就间接申请了腾讯云的COS对象存储。这篇文章就来记载一下,SpringBoot整合腾讯云COS对象存储成功文件上行的。
一、预备上班
整合前须要做一些预备上班,申请COS对象存储,创立存储通,创立访问密钥。
1. 申请腾讯云对象存储服务
新用户专享,1米可以购置1年的存储。用来学习还是很香的。
2. 创立存储桶
留意存储桶访问的访问权限,设置成私有读私有写。
3. 密钥治理,创立密钥
点击新建密钥,会智能生成。
三、整合步骤1. 参与maven依赖
代码如下(示例):
com.qcloudcos_api5.6.89
2. yml文件参与性能
代码如下(示例):
# 腾讯云cos性能
cos:baseUrl: HTTPs://xiliu-******24.cos.ap-guangzhou.myqcloud.comsecretId: AKI******************iorsecretKey: zZ*************z6regionName: ap-guangzhoubucketName: xiliu-******24folderPrefix: /upload
3. 新建 COS 性能类
代码如下(示例):
package com.Java.xiliu.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.CompOnent;
/*** @author xiliu* @description 腾讯云cos对象存储性能类* @date 2022/10/28*/
@Data
@Component
@ConfigurationProperties(prefix = "cos")
public class CosConfig {/*** 存储桶访问门路**/private String baseUrl;/*** 腾讯云账号秘钥**/private String secretId;/*** 明码秘钥**/private String secretKey;/*** 存储桶地域**/private String regionName;/*** 存储桶称号**/private String bucketName;/*** 上行的根目录**/private String folderPrefix;public COSClient getCosClient() {// 初始化用户信息COSCRedentials cosCredentials = new BasicCOSCredentials(this.secretId,this.secretKey);// 设置地域Region region = new Region(this.regionName);ClientConfig config = new ClientConfig(region);// 生成COS客户端COSClient client = new COSClient(cosCredentials,config);return client;}
}
4. 新建 COS 上行工具类
代码如下(示例):
package com.java.xiliu.common.untils.file;
import com.java.xiliu.common.untils.SpringUtils;
import com.java.xiliu.config.CosConfig;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.UploadResult;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.Upload;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/*** @author xiliu* @description 腾讯云COS文件上行工具类* @date 2022/10/31*/
@Slf4j
public class CosClientUtils {/*** 失掉性能信息*/private static CosConfig cosConfig = SpringUtils.getBean(CosConfig.class);public static String upload(MultipartFile file, String dir) throws Exception {String originalFilename = file.getOriginalFilename();// 文件名String name = FilenameUtils.getBaseName(originalFilename) + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));// 目录String folderName = cosConfig.getFolderPrefix() + "/" + dir + "/";String key = folderName + name;File localFile = null;try {localFile = transferToFile(file);String filePath = uploadFileToCos(localFile, key);log.info("upload COS successful: {}", filePath);return filePath;} catch (Exception e) {throw new Exception("文件上行失败");} finally {localFile.delete();}}/*** 用缓冲区来创立暂时文件* 经常使用 MultipartFile.transferTo()* @param multipartFile* @return*/private static File transferToFile(MultipartFile multipartFile) throws IOException {String originalFilename = multipartFile.getOriginalFilename();String prefix = originalFilename.split("\\.")[0];String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));File file = File.createTempFile(prefix, suffix);multipartFile.transferTo(file);return file;}/*** 上行文件到COS* @param localFile* @param key* @return*/private static String uploadFileToCos(File localFile, String key) throws InterruptedException {PutObjectRequest putObjectRequest = new PutObjectRequest(cosConfig.getBucketName(), key, localFile);// 失掉衔接COSClient cosClient = cosConfig.getCosClient();// 创立线程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 16,4, TimeUnit.SECONDS, new ArrayBlockingQueue(10), new ThreadPoolExecutor.AbortPolicy());// 传入一个threadPool, 若不传入线程池, 自动TransferManager中会生成一个复线程的线程池TransferManager transferManager = new TransferManager(cosClient, threadPool);// 前往一个异步结果Upload, 可同步的调用waitForUploadResult期待upload完结, 成功前往UploadResult, 失败抛出意外Upload upload = transferManager.upload(putObjectRequest);UploadResult uploadResult = upload.waitForUploadResult();transferManager.shutdownNow();cosClient.shutdown();String filePath = cosConfig.getBaseUrl() + uploadResult.getKey();return filePath;}
}
5. 新建 Controller 上行接口
代码如下(示例):
@ApiOperation(value = "用户头像上行")@PostMapping("/profile/avatar")public R uploadAvatar(@RequestParam("avatarfile") MultipartFile file) throws Exception {if (!file.isEmpty()) {String avatar = CosClientUtils.upload(file, "avatar");return R.ok(avatar);}return R.error("上行头像意外,请咨询治理员");}
6. 测试
经常使用 Swagger 接口文档或许Postman测试上行接口,成功前往地址。经常使用阅读器关上该前往地址,可以反常预览。
总结
本文地址: https://yihaiquanyi.com/article/34c5390f8c05b90c8827.html
上一篇:云主机要不要总更新...