SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

作者:KK·Liu先生 时间:2021-06-01 03:25:14 

企业级项目开发中都会有文件、图片、视频等文件上传并能够访问的场景,对于初学者Demo可能会直接存储在应用服务器上;对于传统项目可能会单独搭建FastDFS、MinIO等文件服务来实现存储,这种方案可能对于企业成本较小,但缺点也是很多,例如:1、增加技术人员的运维和维护成本,2、规模越来越大时需要硬件的支持,且存在文件丢失风险,3、服务器没有CDN,用户访问网站图片加载慢用户体验不好。

所以,一般上规模的项目、或者追求用户体验的项目可能会考虑使用第三方的云服务来存储,市场主流厂商有:七牛云、阿里云OSS、腾讯云COS等,具体采用哪种存储方案需结合项目、规模、成本等因素,综合考量确定。

因为用的腾讯云服务器,为了方便统一管理,所以直接用了腾讯云的COS对象存储服务,下面是基于SpringBoot和腾讯云COS提供的Java SDK快速对接实现文件上传功能。

1、开通腾讯云对象存储服务

https://console.cloud.tencent.com/cos5

2、创建存储桶

SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

3、密钥管理,新建密钥

SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

4、yml配置密钥、COS信息


cos:
 baseUrl: fxxxxxa-1xxxxx1.cos.ap-shanghai.myqcloud.com
 accessKey: AKxxxxxxxxxxxxxxxxxxxxxxxxxCF
 secretKey: oKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxni
 regionName: ap-shanghai
 bucketName: fxxxxxa-1xxxxx1
 folderPrefix: /files

5、COSConfig配置类


@Data
@Component
@ConfigurationProperties(prefix = "cos")
public class COSConfig {
   private String baseUrl;
   private String accessKey;
   private String secretKey;
   private String regionName;
   private String bucketName;
   private String folderPrefix;
}

6、COS文件上传工具类


/**
* 腾讯云COS文件上传工具类
*/
@Slf4j
public class COSClientUtil {

/**
    * 获取配置信息
    */
   private static COSConfig cosConfig = SpringBeanUtils.getBean(COSConfig.class);

/**
    * 初始化用户身份信息
    */
   private static COSCredentials cred = new BasicCOSCredentials(cosConfig.getAccessKey(), cosConfig.getSecretKey());

/**
    * 设置bucket的区域
    */
   private static ClientConfig clientConfig = new ClientConfig(new Region(cosConfig.getRegionName()));

/**
    * 生成COS客户端
    */
   private static COSClient cosClient = new COSClient(cred, clientConfig);

/**
    * 上传文件
    *
    * @param file
    * @return
    * @throws Exception
    */
   public static String upload(MultipartFile file) throws Exception {
       String date = DateUtils.formateDate(new Date(), "yyyy-MM-dd");
       String originalFilename = file.getOriginalFilename();
       long nextId = IdGenerator.getFlowIdWorkerInstance().nextId();
       String name = nextId + originalFilename.substring(originalFilename.lastIndexOf("."));
       String folderName = cosConfig.getFolderPrefix() + "/" + date + "/";
       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();
       }
   }

/**
    * 上传文件到COS
    *
    * @param localFile
    * @param key
    * @return
    */
   private static String uploadFileToCOS(File localFile, String key) throws InterruptedException {
       PutObjectRequest putObjectRequest = new PutObjectRequest(cosConfig.getBucketName(), key, localFile);
       ExecutorService threadPool = Executors.newFixedThreadPool(8);
       // 传入一个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;
   }

/**
    * 用缓冲区来实现这个转换, 即创建临时文件
    * 使用 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;
   }

}

7、Controller测试上传接口:


   /**
    * 腾讯云COS上传
    *
    * @param file
    * @return
    * @throws Exception
    */
   @PostMapping(value = "/cosUpload")
   public ResponseEntity cosUpload(MultipartFile file) throws Exception {
       String filePath = COSClientUtil.upload(file);
       UploadDTO dto = UploadDTO.builder().filePath(filePath).build();
       return ResultVOUtil.success(dto);
   }

8、PostMan接口调用

SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

9、浏览器预览效果

SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

来源:https://blog.csdn.net/qq_40087415/article/details/122027162

标签:SpringBoot,腾讯云COS,文件上传
0
投稿

猜你喜欢

  • java中常见的死锁以及解决方法代码

    2023-04-07 19:47:30
  • ListView滑动隐藏显示ToolBar的实例

    2022-09-15 23:15:52
  • Android性能优化之Bitmap图片优化详解

    2023-08-06 02:54:23
  • Struts2实现多文件上传功能

    2021-11-01 13:50:25
  • java为什么会出现精度丢失这种现象你知道吗

    2023-07-04 05:24:38
  • 解析Spring Mvc Long类型精度丢失问题

    2021-11-06 12:27:37
  • android Launcher3设置默认桌面应用

    2022-07-20 20:18:42
  • Java8中接口的新特性使用指南

    2023-01-21 15:19:26
  • C#中IEnumerable、ICollection、IList、List之间的区别

    2022-07-27 18:15:07
  • Android解决所有双击优化的问题

    2023-07-27 09:07:03
  • C#身份证验证小例子

    2022-06-22 05:22:01
  • Unity使用多态制作计算器功能

    2022-10-15 02:50:06
  • IntelliJ IDEA maven 构建简单springmvc项目(图文教程)

    2021-09-13 05:40:40
  • springdata jpa使用Example快速实现动态查询功能

    2022-12-01 21:49:08
  • 多线程如何解决for循环效率的问题

    2023-12-02 08:31:55
  • java Semaphore共享锁实现原理解析

    2021-11-02 23:12:38
  • Android startService的使用与Service生命周期案例详解

    2021-07-14 01:51:24
  • spring cloud将spring boot服务注册到Eureka Server上的方法

    2023-12-08 19:42:09
  • Java判断字符串是否为IP地址的方法

    2023-07-06 15:02:58
  • jenkins+maven+svn自动部署和发布的详细图文教程

    2023-08-24 05:18:07
  • asp之家 软件编程 m.aspxhome.com