SpringBoot整合阿里云OSS文件存储解决方案

news2024/11/29 1:56:40

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:SpringBoot实战


系列文章目录

以下是专栏部分内容,更多内容请前往专栏查看!

标题
一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码)
一张思维导图带你学会Springboot创建全局异常、自定义异常
一张思维导图带你打通SpringBoot自定义拦截器的思路
28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈
一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署
一张流程图带你学会SpringBoot结合JWT实现登录功能
一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件
一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存
一张思维导图带你学会SpringBoot使用AOP实现日志管理功能

在这里插入图片描述


专栏推荐

  • 专门为Redis入门打造的专栏,包含Redis基础知识、基础命令、五大数据类型实战场景、key删除策略、内存淘汰机制、持久化机制、哨兵模式、主从复制、分布式锁等等内容。链接>>>>>>>>>《Redis从头学》
  • 专门为RabbitMQ入门打造的专栏,持续更新中。。。。。。。。链接>>>>>>>《图解RabbitMQ》

文章目录

  • 系列文章目录
  • 专栏推荐
  • 🌟前言
  • 🌟介绍
  • 🌟准备
  • 🌟引入依赖
  • 🌟配置文件
  • 🌟配置类
  • 🌟文件上传组件-service层
  • 🌟上传文件接口
  • 🌟写在最后

🌟前言

对于项目中的文件存储有两张方案,一种是存储在项目中,另一种则是采用分布式存储。第一种解决方案,随着文件数量越来越多,对于文件上传下载的带宽有影响并且对于以后存储的扩容有很大的不便性。本文来说一张分布式存储中的云厂商文件系统解决方案,有关于阿里云OSS文件上传的使用。

🌟介绍

官网:https://www.aliyun.com/product/oss?utm_content=se_1014317304
上述是官网地址,没有用过的,可以申请三个月的体验期。

它是具有与平台无关的Restful api接口。任何应用、时间、语言都可以访问。并且分为多种存储类型:标准存储类型、低频访问类型、归档访问类型、冷归档访问类型。其存储类型的数据热度从大到小一次为:标准、低频、归档、冷归档。

🌟准备

1.创建bucket。这里要注意读写权限选择公共读。这里截图截错了。
在这里插入图片描述
2.创建用户RAM权限。注意复制key,只会出现一次
在这里插入图片描述

🌟引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

🌟配置文件

进入实例查看endpoint:
在这里插入图片描述

aliyun:
  oss:
    endpoint: oss-cn-beijing.aliyuncs.com
    access-key-id: 你复制的accessID
    access-key-secret: 你复制的keyScret
    bucketname: 你创建的buckert名称

🌟配置类

创建OSS配置类,读取配置文件中的内容。

@ConfigurationProperties(prefix = "aliyun.oss")
@Configuration
@Data
public class OssConfig {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

🌟文件上传组件-service层

上传流程:采用multipartFile。

  1. 读取OSSConfig配置类中的配置。
  2. 根据读取到的endpoint、accesskeyID、accessScret创建OSS客户端实例Ossclient。
  3. 配置实例参数。
  4. 获取上传的文件名、拓展名;定义上传后的文件名。
  5. 拼接路径
  6. 返回上传后的路径地址。
 @Autowired
    private OSSConfig ossConfig;

    /**
     * oss上传文件
     * 1.创建oss客户端实例
     * 2.配置实例参数
     * 3.拼接路径
     * @param file
     * @return
     */
    @Override
    public String uploadFile(MultipartFile file) {
        String endPoint=ossConfig.getEndpoint();
        String accessKeyId=ossConfig.getAccessKeyId();
        String accessKeyScret=ossConfig.getAccessKeySecret();
        String bucketName= ossConfig.getBucketName();
        //创建ossClient实例
        OSS ossClient= new OSSClientBuilder().build(endPoint,accessKeyId,accessKeyScret);
        //拼接路径
        String originFileName=file.getOriginalFilename();
        DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy/mm/dd");
        LocalDateTime localDateTime=LocalDateTime.now();
        //根据日期分类文件夹
        String folderName=dtf.format(localDateTime);
        //新文件名
        String newFileName= CommonUtil.getRandom(4);
        //获取拓展名
        String extension=originFileName.substring(originFileName.lastIndexOf("."));
        String newFile="user/"+folderName+"/"+newFileName+extension;
        //推送
        try {
            PutObjectResult result = ossClient.putObject(bucketName, newFile, file.getInputStream());
            if (result!=null){
                return "https://"+endPoint+"."+bucketName+"."+"/"+newFile;
            }
        } catch (IOException e) {
            throw new SelfException(GlobalExceptionEnum.FILE_UPLOAD_ERROR);
        }finally {
            ossClient.shutdown();
        }
        return null;
    }

🌟上传文件接口

  /**
     * 头像上传
     * @param file 上传的文件
     * @return
     */
    @ApiOperation("头像上传")
    @PostMapping("upload")
    public JsonResult upload(@ApiParam(value = "文件") @RequestPart(value = "file")MultipartFile file){
        String path = fileService.uploadFile(file);
        if (StringUtils.isBlank(path)){
            return JsonResult.exceptionResponse(GlobalExceptionEnum.FILE_UPLOAD_ERROR);
        }
        return JsonResult.success("上传成功",path);
    }

🌟写在最后

有关于SpringBoot整合阿里云OSS实现文件上传介绍到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI视野·今日Sound 声学论文速览 第十五期】Fri, 29 Sep 2023

AI视野今日CS.Sound 声学论文速览 Fri, 29 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Audio-Visual Speaker Verification via Joint Cross-Attention Authors R. Gnana Praveen, Jahangir Alam使用语音信号进行了说话人验证的…

Web开发-新建Spring Boot项目

目录 Spring Boot 与 Web开发Spring Boot 与 MavenJava 环境搭建下载JDK下载xmapp下载navicat for mysql下载Eclipse配置tomcat配置maven 新建Spring Boot项目 Spring Boot 与 Web开发 Spring Boot 是一种用于简化 Spring 应用程序开发、部署和运行的框架&#xff0c;而 Web 开…

【LeetCode】滑动窗口妙解无重复字符的最长子串

Problem: 3. 无重复字符的最长子串 文章目录 思路算法原理分析暴力枚举 哈希表滑动窗口 复杂度Code 思路 首先我们来分析一下本题的思路 如果读者有看过 长度最小的子数组 的话就可以清楚这个子串其实和子数组是一个道理&#xff0c;都是 连续的一段区间但是呢它们本质上还是存…

【数据结构】队列和栈

大家中秋节快乐&#xff0c;玩了好几天没有学习&#xff0c;今天分享的是栈以及队列的相关知识&#xff0c;以及栈和队列相关的面试题 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作…

Java字符缓冲流自己特有的方法进行读入和写出

代码如下&#xff1a; public class MyWork {public static void main(String[] args) throws IOException{BufferedReader fr new BufferedReader(new FileReader("myfile/abc.txt"));BufferedWriter fw new BufferedWriter(new FileWriter("myfile/test.tx…

(一)gitblit安装教程

(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 前言安装1.下载Java Runtime Requirement 2.设置环境变量3.gitblit内容3.1 gitblit文件夹内容3.2 defaults.properties 主要配置选项 4 配置4.1 准备文件4.2 修改gitblit.properties4.3 修改authori…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 E: 数三角

[蓝桥杯 2023 国 B] 数三角 【问题描述】 小明在二维坐标系中放置了 n n n 个点&#xff0c;他想在其中选出一个包含三个点的子集&#xff0c;这三个点能组成三角形。然而这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选…

凉鞋的 Unity 笔记 101. Hello Unity

101. Hello Unity 学习任何一门技术&#xff0c;第一件事就是先完成 Hello World&#xff01;的输出 所以我们来完成 Unity 的 Hello World。 我们所使用的 Unity 版本是 2023.x 版本。 安装的过程就不给大家展示了。 我们从新建项目开始。 新建项目 打开 Unity Hub 后&…

商圣范蠡见好就收,散尽钱财求得好死

有所得必有所失&#xff0c;有所利必有所害。 人弃我捡&#xff0c;人争我弃。 巴菲特说过&#xff1a;“别人恐惧我贪婪&#xff0c;别人贪婪我恐惧。” 一、商圣 公元前536年&#xff0c;范蠡出生在楚国&#xff0c;家境贫寒。范蠡&#xff0c;字少伯。虽然家里穷&#xf…

大数据Doris(三):Doris编译部署篇

文章目录 Doris编译部署篇 一、Doris编译

装饰器模式详解和实现

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将对象添加到现有对象中&#xff0c;以提供额外的功能&#xff0c;同时又不影响其他对象。 实现示例 1.定义一个接口或抽象类&#xff0c;表示被装饰对象的公共接口 //抽…

[02] Multi-sensor KIT: DSP 矩阵运算-加法,减法和逆矩阵,放缩,乘法和转置矩阵

1.概述 2.API ◄ arm_mat_init_f32 浮点矩阵初始化 ◄ arm_mat_add_f32 矩阵加法 ◄ arm_mat_mult_f32 矩阵乘法 ◄ arm_mat_inverse_f32 矩阵A的逆矩阵 ◄ arm_mat_scale_f32 矩阵A乘以系数 ◄ arm_mat_inverse_f32 矩阵A减法 ◄ arm_mat_inverse_f32 矩阵A的装置 3.矩阵初…

Spring Security 简单token配置

Spring Security 简单token配置 说明&#xff1a;非表单配置 先上码&#xff1a; https://gitee.com/qkzztx_admin/security-demo/tree/master/demo-two 环境&#xff1a;win10 idea2023 springboot2.7.6 maven3.8.6 代码清单说明 依赖&#xff1a; <dependency><…

mysql报错:Column Count Doesn‘t Match Value Count at Row 1

mysql中执行insert、update、delete报错&#xff1a;Column Count Doesnt Match Value Count at Row 1 的解决方案 通常情况&#xff1a;字段不匹配 如&#xff1a;student有id, name, age字段 -- 错误写法 INSERT INTO student VALUES(5,horse)-- 正确写法 INSERT INTO stu…

【JavaEE】CAS(Compare And Swap)操作

文章目录 什么是 CASCAS 的应用如何使用 CAS 操作实现自旋锁CAS 的 ABA 问题CAS 相关面试题 什么是 CAS CAS&#xff08;Compare and Swap&#xff09;是一种原子操作&#xff0c;用于在无锁情况下保证数据一致性的问题。它包含三个操作数——内存位置、预期原值及更新值。在执…

ElasticSearch 10000条查询数量限制

一、前言 我们将库存快照数据导入ES后发现要分页查询10000条以后的记录会报错&#xff0c;这是因为ES通过index.max_result_window这个参数控制能够获取数据总数fromsize最大值&#xff0c;默认限制是10000条&#xff0c;因为ES考虑到数据要从其它节点上报到协调节点如果搜索请…

【Java 进阶篇】MySQL启动与关闭、目录结构以及 SQL 相关概念

MySQL 服务启动与关闭 MySQL是一个常用的关系型数据库管理系统&#xff0c;通过启动和关闭MySQL服务&#xff0c;可以控制数据库的运行状态。本节将介绍如何在Windows和Linux系统上启动和关闭MySQL服务。 在Windows上启动和关闭MySQL服务 启动MySQL服务 在Windows上&#x…

基于Java的毕业设计管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Vue iconfont-阿里巴巴矢量图标库用法

一、vue使用 选择心仪的图标 加入购物车 点击右上角购物车&#xff0c;点击添加至项目 在资源管理 可以看到我的项目 进入项目设置勾选彩色 点击下载到本地 解压压缩包 在main.js文件内导入css文件 import "/assets/font_icon/iconfont.css"; 使用&#xff1a; 复…

第80步 时间序列建模实战:GRNN回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用Matlab进行GRNN模型的构建。 使用的数据如下&#xff1a; 采用《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrom…