【2023】springboot通过阿里云oss进行文件单个批量文件上传下载

SpringBoot整合阿里OSS实现上传下载

目录💻

  • 前言
  • 一、介绍
  • 二、阿里云添加oss
    • 1、进入oss目录
    • 2、创建bucket
    • 3、测试上传下载
    • 4、创建AccessKey管理账号
  • 三、依赖以及配置
    • 1、依赖
    • 2、yml
    • 3、Config类
    • 4、OSSUtil 工具类
  • 四、controller
  • 五、测试
    • 1、测试上传
    • 2、测试删除

前言

写该项目主要是自己编写小程序,需要进行存储一些图片以及视频,在我们进行文件存储的时候,主要可以通过纪中途径进行存储,可以选择通过转二进制直接存储在数据库,或者直接存储在前端服务器,也可以自己搭建一个文件存储系统(如minio、FastDFS等),还有就是可以存储在第三方搭建好的云存储服务器,最常用的就是阿里OSS了,也就是我使用的、拿来即用。

一、介绍

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。

本文在使用上主要使用的springboot对阿里云OSS进行单独以及批量上传、删除对应的文件,下载一般会采用直接通过http直接连接阿里云OSS下载。

二、阿里云添加oss

1、进入oss目录

进入官网后点击控制台,注册或者登陆自己的账号

在这里插入图片描述

点击左上角的导航页,在选择对象存储oss
在这里插入图片描述
看到这样的就是你oss的主页列表了
在这里插入图片描述

2、创建bucket

  • 添加名字(需要唯一,可以根据项目名定义);
  • 地域选择自己最近的城市;
  • 存储类型(根据自己情况来)
  • 存储冗余类型(默认就行)
    在这里插入图片描述
  • 阻止公共访问:一般不需要开通,因为我们给前端的是链接
  • 读写权限:
    • 一般选择公共读:就是可以通过链接直接读取下载文件、
    • 私有:就是上传下载都需要验证
    • 公共读写:不选择,不安全
  • 所属资源组:默认,
  • 下面都也全部默认就行

点击完成创建
再点击确认、会提示创建成功
在这里插入图片描述

可以看到刚刚创建的
在这里插入图片描述

3、测试上传下载

  • 双击bucket可以进入管理页面进行上传下载
  • 选择文件上传
    在这里插入图片描述
  • 可以看到刚刚上传的

在这里插入图片描述

  • 点击详情可以看到基础信息,可以通过url进行下载
    在这里插入图片描述

4、创建AccessKey管理账号

在这里插入图片描述

  • AccessKey列表页面

在这里插入图片描述

  • 点击创建,会先要验证身份,验证完后就创建成功了
    可以拿到,然后记得下载文件,复制好自己的,用做调用时的身份验证
    <AccessKey ID和 AccessKey Secret
    在这里插入图片描述

三、依赖以及配置

项目搭建好之后,依赖和配置除了,oss的其他的自己根据自己情况去添加

1、依赖

主要是oss的依赖以及几个基础的

      <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.12</version>
        </dependency>
            <!--oss-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>
                <!-- SpringWeb模块 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
         <!-- swagger-->
              <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

2、yml

主要要设置spring的文件上传的大小以及oss配置

# Spring配置
spring:
  # 文件上传
  servlet:
    multipart:
      # 单个文件大小
      max-file-size: 1024MB
      # 设置总上传的文件大小
      max-request-size: 1024MB

oss:
  accessKeyId: LTAI5t**** # 到阿里云上获取的AccessKey管理账号id
  endpoint: oss-cn-shanghai.aliyuncs.com  # 地址,看自己选择的阿里云是哪个地方的服务器。规则: oss-cn-城市拼音.aliyuncs.com
  accessKeySecret: mJCpS3kc**** # 阿里云的AccessKey管理账号Secret
  bucketName: test # bucket名字

3、Config类

用作把oss客户端对象注入到bean容器,因为我们是使用springboot进行管理项目的,直接在启动的时候就建立连接,避免每次请求时建立一个新的连接,出现连接过多的问题

/**
 * @projectName: lightyear_web
 * @package: com.ruoyi.common.utils
 * @className: OSSUtil
 * 阿里oss操作工具类
 * @version: 1.0
 */
@Configuration
public class OSSConfig {

//    阿里云访问地址
    @Value("${oss.endpoint}")
    private  String endpoint ;
    @Value("${oss.accessKeyId}")
    private  String accessKeyId ;
    @Value("${oss.accessKeySecret}")
    private  String accessKeySecret ;

    @Bean
    public OSS getOSSClient(){
        return new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);

    }

}

4、OSSUtil 工具类

/**
 * @projectName: lightyear_web
 * @package: com.ruoyi.common.utils
 * @className: OSSUtil
 * 阿里云oss上传工具类
 * @version: 1.0
 */
@Slf4j
@Component
public class OSSUtil {

    @Autowired
    private OSS ossClient;

    @Value("${oss.bucketName}")
    private String bucketName ;

    @Value("${oss.endpoint}")
    private  String endpoint ;

    @Autowired
    private ImageService imageService;


    /**
     * @param file: 文件流
     * @return String
     * 单个文件上传
     * @date 2024/4/23 21:52
     */
    public String putOssFile(MultipartFile file){

        String fileName = "";
        try {
            InputStream inputStream = file.getInputStream();
//            获取文件名
             fileName = file.getOriginalFilename();
//            名字
            String imageName = IdUtils.fastSimpleUUID();

            fileName = imageName + "_" + fileName;

//            文件夹路径
            String drwPath = DateUtil.format(new Date(), "yyyy/MM/dd");

            fileName = drwPath + "/" + fileName;

            ossClient.putObject(bucketName, fileName, inputStream);

            String url = "https://" + bucketName +"."+ endpoint + "/" + fileName;

            Image image = new Image();
            image.setId(IdUtil.getSnowflakeNextId());
            image.setImgUrl(url);
            image.setImgName(fileName);
            image.setCreateTime(new Date());
            imageService.save(image);

            return image.getId().toString();

        } catch (IOException e) {
            log.error( "文件上传失败!----->"+fileName);
            log.error(e.getMessage());
            new RuntimeException(fileName+"---文件上传失败!----->"+e.getMessage());

        }
        return null;
    }


    /**
     * @param fileList: 文件流
     * @return String
     * 多个文件上传
     * @date 2024/4/23 21:52
     */
    public String putOssFileList(List<MultipartFile> fileList){

        String ids = "";

        for (MultipartFile file : fileList) {

            String id = putOssFile(file);

            ids = ids + id + ",";
        }
        return ids;

    }



    /**
     * @param imageId: 图片表id
     * @return void
     * 删除单个图片
     * @date 2024/4/24 15:54
     */
    public void deleteOssFile(String imageId){
        Image byId = imageService.getById(imageId);
        String fileName = byId.getImgName();
        ossClient.deleteObject(bucketName, fileName);
        imageService.removeById(byId);
    }

    /**
     * @param imageIdS: 图片表ids
     * @return void
     * 删除单个图片
     * @date 2024/4/24 15:54
     */
    public void deleteOssFileList(String imageIdS){

        String[] split = imageIdS.split(",");

        List<Image> list = imageService.lambdaQuery().in(Image::getId, split).list();
        List<String> fileNameList = list.stream().map(Image::getImgName).collect(Collectors.toList());


        ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(fileNameList).withEncodingType("url"));
        imageService.removeBatchByIds(list);
    }
    
}

四、controller

主要4个接口、单独上传、删除的和批量上传、删除的

@RestController
@Api(tags = "上传")
@RequestMapping("/api/activitys")
public class ActivitysController extends BaseController
{


    @Autowired
    private OSSUtil ossUtil;  

@ApiOperation("文件上传")
    @PostMapping("testFile")
    public AjaxResult testFile(MultipartFile file){
        return success(ossUtil.putOssFile(file));
    }


    /**
     * @param loginUserBody:
     * @return AjaxResult
     * 多个文件上传
     * @date 2024/4/24 16:47
     */
    @PostMapping("/testFileList")
    @ApiOperation("多个文件上传")
    public AjaxResult testFileList(@RequestParam(required = false) MultipartFile avatar,
                                   @RequestParam MultipartFile[] qualifications,
                                    LoginUserBody loginUserBody){
        ArrayList<Object> list = new ArrayList<>();

        if (qualifications != null){
            List<MultipartFile> list1 = Arrays.asList(qualifications);
            String id = ossUtil.putOssFileList(list1);
            list.add(id);
        }
        if (avatar != null){
            String id = ossUtil.putOssFile(avatar);
            list.add(id);
        }
        return success(list);
    }

    /**
     * @param imageId:
     * @return AjaxResult
     * 单个删除
     * @date 2024/4/24 16:47
     */
    @DeleteMapping("deleteFile")
    public AjaxResult deleteFile(String  imageId){
        ossUtil.deleteOssFile(imageId);
        return success();
    }


    /**
     * @param imageIdS:
     * @return AjaxResult
     * 批量删除
     * @date 2024/4/24 16:47
     */
    @DeleteMapping("deleteFileList")
    public AjaxResult deleteFileList(String  imageIdS){
        ossUtil.deleteOssFileList(imageIdS);
        return success();
    }
}

五、测试

1、测试上传

通过postman进行上传测试、可以一次性上传多一个或者多个文件,返回最后存储到数据库表中的对应记录的id

  • 批量删除
    在这里插入图片描述

如果在对应的路径下可以看到文件那说明上传成功了
在这里插入图片描述
存储到数据库的url,可以直接通过浏览器下载,说明地址也没问题了
在这里插入图片描述

2、测试删除

通过id进行删除对应的
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【调制】π/4-DQPSK信号模型及其相关特性分析 【附MATLAB代码】

MATLAB代码 % pi/4-DQPSK modulation %输入一串数&#xff0c;输出经过差分并映射的I、Q两路数据 ​ function [I,Q]pi4_dqpskmod(data) ​ nlength(data)./2; data1data.*2-1; ​ Idatazeros(1,n); Qdatazeros(1,n); ​ ​ Idatadata1(1,1:2:2*n); %串并变换 Qdatadata1(…

用户中心 -- 代码理解

一、删除表 & if 删除表 1.1 DROP TABLE IF EXISTS user 和 DROP TABLE user 网址&#xff1a; 用户管理第2节课 -- idea 2023.2 创建表--【本人】-CSDN博客 二、 代码 2.1 清空表中数据 的 命令 【truncate 清空】 网址&#xff1a; 用户管理第2节课 -- idea 2…

卡尔曼滤波器(二):Simulink卡尔曼滤波器模块使用

观看MATLAB技术讲座笔记&#xff0c;该技术讲座视频来自bilibili账号&#xff1a;MATLAB中国。 本节在Simulink中用卡尔曼滤波器来滤除传感器噪声&#xff0c;准确估算单摆摆角。 一、单摆模型简介 不考虑摩擦时&#xff0c;下图所示的单摆力学平衡方程为&#xff1a; m l 2…

‍ 太空网络攻击

&#x1f9d1;‍&#x1f680; 尤里-加加林成为征服外太空的第一人。他在 1961 年 4 月 12 日的飞行有力地推动了全世界的科技发展。 有趣的事实是&#xff1a;苏联所有首次太空发射&#xff08;包括加加林的飞行&#xff09;的弹道计算都是在苏联第一个计算机中心的电子计算机…

从数据库中到处所有表的列、注释、类型、是否必填等信息

从数据库中到处所有中文表名、英文表名、所有列、注释、类型、长度、是否必填等信息&#xff0c;效果如下&#xff1a; 要实现上面的表格可以直接用SQL实现&#xff0c;实现SQL如下&#xff1a; #查询SQL select* FROMinformation_schema.COLUMNS as columns left join (sele…

(七)Idea编辑器集成Tomcat

1. 点击桌面上Idea快捷方式打开Idea编辑器&#xff0c;假如没有创建项目的话打开Idea编辑器后的界面展示如下图所示 2. 点击界面左侧菜单中的自定义 3. 然后点击界面中的“所有设置...”,然后点击“构建、执行、部署”&#xff0c;选择其中的“应用程序服务器” 4. 点击“”按钮…

LeetCode 1052. 爱生气的书店老板

题目链接 https://leetcode.cn/problems/grumpy-bookstore-owner/description/?envTypedaily-question&envId2024-04-23 先把最初的满意人数累加算出来&#xff0c;然后使用滑动窗口来模拟连续 minutes分钟不生气&#xff0c;计算不生气minutes分钟最大的满意数 class S…

【智能算法】吉萨金子塔建造算法(GPC)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;S Harifi等人受到观古代遗迹构造启发&#xff0c;提出了吉萨金子塔建造算法&#xff08;Giza Pyramids Construction, GPC&#xff09;。 2.算法原理 2.1算法思想 GPC模拟了古埃…

LeetCode:2385. 感染二叉树需要的总时间(DFS Java)

目录 2385. 感染二叉树需要的总时间 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 2385. 感染二叉树需要的总时间 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第…

文本语音互相转换系统设计

title: 文本语音互相转换系统设计 date: 2024/4/24 21:26:15 updated: 2024/4/24 21:26:15 tags: 需求分析模块化设计性能优化系统安全智能化跨平台区块链 第一部分&#xff1a;导论 第一章&#xff1a;背景与意义 文本语音互相转换系统的定义与作用 文本语音互相转换系统是…

CTFshow-PWN-栈溢出(pwn43)

32位的 system(); 但是好像没"/bin/sh" 上面的办法不行了&#xff0c;想想办法 检查&#xff1a;32 位程序 ida 分析&#xff1a; 跟进 ctfshow 函数 定义了一个长度为 104 的字符数组 s&#xff0c;gets() 函数被用来从标准输入&#xff08;键盘&#xff09;中读取…

CU-Mamba:具有通道学习功能的选择性状态空间模型用于图像恢复

CU-Mamba&#xff1a;具有通道学习功能的选择性状态空间模型用于图像恢复 摘要IntroductionRelated WorkMethod CU-Mamba: Selective State Space Models with Channel Learning for Image Restoration 摘要 重建退化图像是图像处理中的关键任务。尽管基于卷积神经网络&#x…

【人工智能基础】人工神经网络

一、人工神经网络的三要素 人工神经元数理模型 MP模型是世界上第一个神经计算模型&#xff0c;为神经网络理论提供了基础 MP模型功能 对树突输入u的线性加权求和对净输入的非线性转换\ 作用函数的功能作用函数的功能 MP神经元模型的作用函数是单位阶跃函数。当x≥0时f(x)…

JTS:Java Topology Suit

接口文档:org.locationtech.jts:jts-core 1.19.0 API。 开发文档:JTS | Documentation。 概述 JTS提供了平面线性几何(planar and linear geometry)与相关的基础几何处理函数(a set of fundamental geometric functions.)。 JTS遵循OGC发布的简单几何规范(Simple Featu…

递归、搜索与回溯算法:综合练习

例题一 解法&#xff1a; 算法思路&#xff1a; ⾸先&#xff0c;我们在第⼀⾏放置第⼀个皇后&#xff0c;然后遍历棋盘的第⼆⾏&#xff0c;在可⾏的位置放置第⼆个皇后&#xff0c;然后再遍历第三⾏&#xff0c;在可⾏的位置放置第三个皇后&#xff0c;以此类推&#xff0c…

nodejs切换

1.卸载nodejs 2.下载nvm工具 3.检查nvm安装情况 nvm -v3.nvm 安装命令 nvm install 10.16.34.查询nodejs版本 nvm list5.切换nodejs版本 nvm use 10.16.3

⑤【Shiro】SpringBoot整合Shiro,实现登录认证

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ⑤【Shiro】SpringBoot整合Shiro&#xff0c;实…

精度论文Generative Prompt Model for Weakly Supervised Object Localization

Generative Prompt Model for Weakly Supervised Object Localization 中国科学院大学&&浙江大学CVPR20231.Abstract 当从图像类别标签中学习对象定位模型时,弱监督对象定位(WSOL)仍然具有挑战性, 传统的鉴别训练激活模型的方法忽略了具有代表性但鉴别性较差的对象…

弱光图像增强 | 基于TensorFlowLite+TensorRT加速的MIRNet弱光图像增强实现

项目应用场景 面向弱光图像增强场景&#xff0c;项目基于 MIRNet 弱光图像增强算法&#xff0c;采用 TensorRT TensorFlow-Lite 进行 GPU 算法加速推理。 项目效果 项目细节 > 具体参见项目 README.md (1) 具体参考项目内 jupyter&#xff0c;包括 MIRNet_TFLite.ipynb、M…

云南旅游攻略

丽江景点 Day1 ——丽江古城 丽江古城是一个充满文化和历史的地方&#xff0c;拥有丰富的景点和活动。 推荐游玩&#xff1a; 参观标志性建筑&#xff1a;大水车是丽江古城的标志性建筑&#xff0c;可以在这里拍照留念。 探索中心广场&#xff1a;四方街是古城的中心&#xf…