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

news2024/11/18 1:52:01

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.coloradmin.cn/o/1621306.html

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

相关文章

牛客 题解

文章目录 day4_17**BC149** **简写单词**思路&#xff1a;模拟代码&#xff1a; dd爱框框思路&#xff1a;滑动窗口&#xff08;同向双指针&#xff09;代码&#xff1a; 除2&#xff01;思路&#xff1a;模拟贪心堆代码&#xff1a; day4_17 BC149 简写单词 https://www.now…

stm32F407-PS手柄代码,20240424

一、硬件接线 手柄接收器—stm32板子 GND—GND VCC—5V DAT–F3 CMD–F5 CS–F6 CLK–F4 二、PStwo.h #ifndef __PSTWO_H #define __PSTWO_H//F3 F5 F6 F4 F10 // #include "delay.h" #include "sys.h"#define DI PFin(3) //PB12 输入#defin…

C# Solidworks二次开发:枚举应用实战(第三讲)

大家好&#xff0c;今天继续介绍枚举相关内容。 下面是今天要介绍的枚举&#xff1a; &#xff08;1&#xff09;第一个为swACisOutputVersion&#xff0c;这个枚举为ACIS的版本&#xff0c;下面是官方的具体解释&#xff1a; 其枚举值为&#xff1a; MemberDescriptionswAc…

git切换源失败解决方案

git切换源失败解决方案 git切换源git切换源失败(无效) git切换源 git可以使用命令行切换源&#xff0c;一般使用的源有两个地址&#xff0c;git原生地址和淘宝镜像地址&#xff0c;部分公司会使用内部地址。 源切换后&#xff0c;npm i就是从源地址拉取相关依赖了。 原生地址…

选择合适的监控观测平台,为业务出海合规建设减负

在全球化商业版图的浩瀚海洋中&#xff0c;企业如同一艘勇敢的船只&#xff0c;突破重重阻碍&#xff0c;勇往直前。在这一征途中&#xff0c;监控观测活动是导航中的指南罗盘&#xff0c;确保企业航向正确、安全稳定&#xff0c;成为企业出海路上维护业务稳定和数据安全的关键…

【论文解析】笔触渲染生成 前沿工作梳理

最近的一些工作梳理 2023年 Stroke-based Neural Painting and Stylization with Dynamically Predicted Painting Region 2022年Im2Oil: Stroke-Based Oil Painting Rendering with Linearly Controllable Fineness Via Adaptive Sampling 文章目录 1 Stroke-based Neural P…

string 类以及模拟实现

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

【NLP】大语言模型基础之GPT

大语言模型基础之GPT GPT简介1. 无监督预训练2. 有监督下游任务微调 GPT-4体系结构1. GPT-4的模型结构2. GPT-4并行策略3. GPT-4中的专家并行GPT-4的特点 参考连接 以ELMo为代表的动态词向量模型开启了语言模型预训练的大门&#xff0c;此后&#xff0c;出现了以GPT和BERT为代表…

vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)

一、ffmpeg安装​​​​​​ ffmpeg下载 https://ffmpeg.org/download.html找ffmpeg-release-essentials.zip点击下载&#xff0c;下载完解压ffmpeg.exe 程序运行 二、配置ffmpeg环境变量 添加成功后验证是否生效任意地方打开cmd窗口输入 ffmpeg 打印如下表示成功 三、node…

使用IOPaint实现图片擦除路人

IOPaint 是一个免费的开源的 inpainting/outpainting 工具&#xff0c;由最先进的 AI 模型提供支持。 IOPaint 中使用各种模型来修改图像&#xff1a; 擦除&#xff1a;删除任何不需要的物体、缺陷、水印、人物。修复&#xff1a;对图像的特定部分进行修改、添加新对象或替换…

synchronized的底层原理

目录 介绍 实现原理 对象头 Monitor&#xff08;监视器&#xff09; 锁升级 偏向锁 轻量级锁 重量级锁 锁的优缺点 介绍 synchronized 是 Java 中的关键字&#xff0c;它用于锁定代码块或方法&#xff0c;以确保同一时刻只有一个线程可以进入被锁定的部分。这在多线程…

OpenCompass 大模型评测实战——作业

OpenCompass 大模型评测实战——作业 一、基础作业1.1、使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C-Eval 数据集上的性能1.1.1、安装基本环境1.1.2、解压数据集1.1.3、查看支持的数据集和模型1.1.4、启动评测 二、进阶作业2.1、将自定义数据集提交至OpenCompass官网 …

WPS表格,怎样保留每个人的最近日期的那一行数据?

方法很多&#xff0c;这里演示使用排序删除重复项 来完成。具体操作如下&#xff1a; 1. 选中数据区域中任意一个单元格&#xff0c;注意要么全选数据区域&#xff0c;要么只选一个单元格 2. 点击数据选项卡&#xff0c;排序&#xff0c;自定义排序&#xff0c; 在弹出对话框…

Java | Leetcode Java题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution {public int trap(int[] height) {int n height.length;if (n 0) {return 0;}int[] leftMax new int[n];leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] Math.max(leftMax[i - 1], height[i]);}int[] …

单例设计模式c++

什么是单例模式&#xff1f; 单例模式指在整个系统生命周期里&#xff0c;保证一个类只能产生一个实例&#xff0c;确保该类的唯一性。 单例模式分类 单例模式可以分为懒汉式和饿汉式&#xff0c;两者之间的区别在于创建实例的时间不同&#xff1a; 懒汉式&#xff1a;指系…

德国激荡50年的荆棘之路

财通证券表示&#xff0c;过去50年见证了德国如何走出财政泥沼、以保守的货币政策稳步前行&#xff0c;见证了“专精特新”带来的全球竞争力&#xff0c;也见证了产业转型缓慢导致的增长动能缺失。 过去50年&#xff0c;德国经济经历了一段跌宕起伏的发展史&#xff0c;这辆曾…

2024五一萌趣嘉年华主题展活动策划案

2024五一国宝大作战 萌趣嘉年华熊猫滚滚来野主题展活动策划案-53P 活动策划信息&#xff1a; 方案页码&#xff1a;53页 文件格式&#xff1a;PPT 方案简介&#xff1a; 活动思路&#xff1a; 五一马上就要到了~再加上全民关注的对象--大熊猫&#xff01;&#xff01; 这…

SpringCloud系列(14)--Eureka服务发现(Discovery)

前言&#xff1a;在上一章节中我们说明了一些关于服务信息的配置&#xff0c;在本章节则介绍一些关于Discovery的知识点及其使用 1、Discovery是什么&#xff0c;有什么用 Discovery&#xff08;服务发现&#xff09;是eureka的功能和特性&#xff0c;有时候微服务可能需要对外…

【MATLAB源码-第31期】基于matlab的光通信中不同调制方式的误码率对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 光通信&#xff1a; 光通信是一种利用光波传输信息的技术。它使用光信号作为信息的载体&#xff0c;通过调制光波的特性来传输数据&#xff0c;通常利用光纤作为传输介质。光通信具有高带宽、低延迟和大容量等优点&#…

PE结构(二)PE头字段说明

PE头字段 DOS头 PE标记 标准PE头 可选PE头 我们今天分析一下PE头字段中所有重要成员的含义 DOS头 DOS头中我们需要去分析的是如下两个成员&#xff1a; 1.WORD e_magic&#xff1a;MZ标记&#xff0c;用于判断是否为可执行文件&#xff0c;即如果显示4D 5A&#xff0c;…