springboot 文件上传 阿里云OSS

news2024/11/26 12:00:29

一、介绍

文件上传,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发抖音、发朋友圈都用到了文件上传功能。

实现文件上传服务,需要有存储的支持,那么我们的解决方案将以下几种:

  1. 直接将图片保存到服务的硬盘(springmvc中的文件上传)
    1. 优点:开发便捷,成本低
    2. 缺点:扩容困难
  2. 使用分布式文件系统进行存储
    1. 优点:容易实现扩容
    2. 缺点:开发复杂度稍大(有成熟的产品可以使用,比如:FastDFS,MinIO)
  3. 使用第三方的存储服务(例如OSS)
    1. 优点:开发简单,拥有强大功能,免维护
    2. 缺点:付费

在章节介绍阿里云的OSS服务进行文件存储。

二、阿里云 对象存储OSS

这里的阿里云注册购买相关可以学习黑马:

https://www.bilibili.com/video/BV1m84y1w7Tb?p=149&spm_id_from=pageDriver&vd_source=4753af08dc12ba29bcc0b79e921e5dd4

三、代码开发

1、接口文档

请求参数

在这里插入图片描述

返回数据

在这里插入图片描述

可以看到,后端是需要给前端返回一个文件的上传路径的。因为前端可能就是通过这个路径,来将图片展示给用户。

2、yml 配置阿里云信息

开发阶段 使用 dev 开发环境
在 application.yml 中配置阿里云oss

spring:
  profiles:
    active: dev    #设置环境
sky:
  alioss:
    endpoint: ${sky.alioss.endpoint}
    access-key-id: ${sky.alioss.access-key-id}
    access-key-secret: ${sky.alioss.access-key-secret}
    bucket-name: ${sky.alioss.bucket-name}

在 application-dev.yml 中配置上阿里云oss的信息

sky:
  alioss:
    endpoint: oss-cn-hangzhou.aliyuncs.com
    access-key-id: 你的accessskeyid
    access-key-secret: 你的accessskeysecret
    bucket-name: sky-take-out

3、读取OSS配置

通过AliOssProperties 来读取配置文件中的数据,连接到阿里云。

@Component
@ConfigurationProperties(prefix = "sky.alioss")
@Data
public class AliOssProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

}

AliOssProperties
这是一个配置属性类,作用在于:将我们这个配置文件中信息封装成Java对象。
@ConfigurationProperties(prefix = “sky.alioss”)
prefix = "sky.alioss"代表 扫描 yml中前缀为 sky.alioss 的信息。

4、创建工具类AliOssUtil

实现文件上传阿里云OSS

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());

        return stringBuilder.toString();
    }
}

5、再创建OssConfiguration配置类

用于创建第四步的AliOssUtil对象

为什么需要这个配置类呢?
设置成配置类,在我们后端服务启动时,配置类也会生效,在我们需要的时候就可以直接使用配置类中的方法。

/**
 * 配置类,用于创建AliOssUtil对象
 */
@Configuration
@Slf4j
public class OssConfiguration {

    @Bean
    @ConditionalOnMissingBean //保证spring容器中,只有这一个util对象。多了浪费;
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
        log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());
    }
}

6、Controller

/**
 * 通用接口
 */
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {

    @Autowired
    private AliOssUtil aliOssUtil;

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file){
        log.info("文件上传:{}",file);

        try {
            //原始文件名
            String originalFilename = file.getOriginalFilename();
            //截取原始文件名的后缀   dfdfdf.png
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            //构造新文件名称( 防止存在阿里云的文件名重复,会被新的覆盖)
            String objectName = UUID.randomUUID().toString() + extension;

            //文件的请求路径
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            return Result.success(filePath);
        } catch (IOException e) {
            log.error("文件上传失败:{}", e);
        }

        return Result.error(MessageConstant.UPLOAD_FAILED);
    }
}

测试

前端上传文件
配置类在springboot启动后生效。
在这里插入图片描述
上传成功
在这里插入图片描述

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

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

相关文章

01-Spring中事务的实现和事务的属性

银行账户转账异常 需求: 实现act-001账户向act-002账户转账10000,要求两个账户的余额一个减成功一个加成功,即执行的两条update语句必须同时成功或失败 实现步骤 第一步: 引入项目所需要的依赖 <?xml version"1.0" encoding"UTF-8"?> <proj…

LeetCode | 206. 反转链表

LeetCode | 206. 反转链表 OJ链接 这里有两个思路 我们先来看第一个思路&#xff1a; 创建一个新的链表&#xff0c;然后将原链表头插头插需要保存下一个的地址&#xff0c;再头插 代码如下&#xff1a; struct ListNode* reverseList(struct ListNode* head) {struct ListN…

利用机器学习的力量来对抗野火

一、介绍 野火因其对环境、经济和社会的破坏性影响而成为日益紧迫的全球关注点。近年来&#xff0c;野火的频率和强度显著上升&#xff0c;气候变化和土地管理实践等因素加剧了野火。解决这一危机需要创新和多方面的方法&#xff0c;一个有前途的途径是将机器学习整合到野火管理…

Hugging Face高效训练技术一:单 GPU 高效训练

文章目录 一、模型训练1.1 准备测试数据1.2 加载模型1.3 默认配置训练的显存占用1.4 Model’s Operations1.5 Model’s Memory 二、梯度累积&#xff08;Gradient Accumulation&#xff09;2.1 批量大小2.2 梯度累积 三、梯度检查点&#xff08;Gradient Checkpointing&#xf…

8年经验的老程序员,告诉你如何看透面试、通过面试

关注公众号程序员小灰&#xff0c;不迷路&#xff01; 大家好&#xff0c;我是程序员小灰。小灰的公众号里有一位读者朋友鹤涵&#xff0c;是一个8年Java经验的资深程序员&#xff0c;并且当过多年面试官&#xff0c;面试过的人数超过百人。 今天&#xff0c;小灰特意把他邀请过…

优雅设计之美:实现Vue应用程序的时尚布局

前言 页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式。如果使用的是Nuxt&#xff0c;则可以提供开箱即用的优雅解决方案。然而&#xff0c;令人遗憾的是&#xff0c;在Vue中&#xff0c;这些问题并未得到官方文档的解决。 经过多次尝试&#xff0c;小…

C# Onnx Dense Face 3D人脸重建,人脸Mesh

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.…

随笔--解决ubuntu虚拟环境的依赖问题

文章目录 问题一&#xff1a;在conda虚拟环境中报错ImportError: libcupti.so.11.7:cannot open shared object file: No such file or directory解决步骤问题二&#xff1a; RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemmStridedBatched( …

打造高效运营底座,极智嘉一体化软件系统彰显科技威能

在仓储成本和物流需求日益增加的今天&#xff0c;创新且高效的物流机器人解决方案能够显著提升物流运营效率&#xff0c;降低物流成本&#xff0c;实现智能化、精益化、一体化的物流管理。全球仓储机器人引领者极智嘉(Geek)以「一套系统&#xff0c;天生全能」为准则&#xff0…

python 虚拟环境使用

创建虚拟环境 python -m -venv dir dir是要创建虚拟环境的目录,文件夹不存在会自动创建相关的文件夹及其父文件夹. 示例 python -m venv d:\pythonvenv\python3.11.5 这样会在d:\pythonvenv\python3.11.5 目录下创建一个虚拟环境 使用帮助: python -m -venv -h 使用虚拟…

2023下半年软考系统集成项目管理工程师上午真题及答案解析

1.( C )不属于风险识别的信息收集技术。 A.头脑风暴 B.德尔菲技术 C.排除法 D.根本原因分析 解析&#xff1a; 2.( C )不是SaaS(软件即服务)的特点。 A.由供应商管理软件更新和安全 B.无需购买软件 C.需要自行安装和维护软件 D.按需付费 解析&#xff1a; 3.…

蓝牙芯片的 PCB 板载天线设计注意事项

1.天线示意图 1.1 要点说明 ⑴ 板厚不同&#xff0c;适用的天线不同 ⑵ PIFA天线到地的距离不要变&#xff08;很重要&#xff09;&#xff0c;通常在PCB设计时要锁定参考设计复制/拷贝比较好。 ⑶ ANT 馈线需要符合50 欧阻抗&#xff0c;背面需铺铜&#xff0c;板厚、粗细、与…

【编码魔法师系列_构建型2.2】单例模式「懒汉式」(Singleton Pattern)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

如何整合项目计划与执行,看看这篇就够了

项目中的挑战&#xff0c;如同生活中的问题&#xff0c;无处不在。常言道&#xff1a;“家家有本难念的经”&#xff0c;面对这些问题&#xff0c;我们应采取积极的态度&#xff0c;通过有效的沟通&#xff0c;让家人了解我们的困境&#xff0c;这样许多问题就能在无形中得到解…

虚拟机Linux-Centos系统网络配置常用命令+Docker 的常用命令

目录 1、虚拟机Linux-Centos系统网络配置常用命令2、Docker 的常用命令2.1 安装docker步骤命令2.2 在docker容器中安装和运行mysql 1、虚拟机Linux-Centos系统网络配置常用命令 进入网络配置文件目录 cd /etc/sysconfig/network-scripts/用 ls 命令查看文件&#xff1a;ls …

基于SpringAOP实现自定义接口权限控制

文章目录 一、接口鉴权方案分析1、接口鉴权方案2、角色分配权限树 二、编码实战1、定义权限树与常用方法2、自定义AOP注解3、AOP切面类&#xff08;也可以用拦截器实现&#xff09;4、测试一下 一、接口鉴权方案分析 1、接口鉴权方案 目前大部分接口鉴权方案&#xff0c;一般…

Ps:色域警告

Ps菜单&#xff1a;视图/色域警告 View/Gamut Warning 色域警告 Gamut Warning可以依据要模拟的输出设备的色彩能力来确定图像上的哪些颜色可能会超出该设备的色彩范围。 “色域警告”只能起到提示的作用&#xff0c;启用&#xff08;勾选&#xff09;以后&#xff0c;画面上的…

清华软院2024届推免拟录取名单

名单 直博生 硕士生 分析 清华软院2024届共录取推免硕士生68人&#xff0c;其中 专硕085405软件工程 59人&#xff0c;学硕083500软件工程9人&#xff1b;推免直博生 15人 和贵系相比难度要低很多哦&#xff01; 欢迎关注我的公众号 “程序员小风学长”&#xff0c;会定期进…

【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

需求&#xff1a; 1&#xff09;被要求统计代码行数&#xff1b; 2&#xff09;不想打开Linux&#xff0c;懒得下载Windows版本GitStats&#xff1b; 3&#xff09;打开了Linux但也不记得find命令行怎么用&#xff1b; 4&#xff09;打开了Linux&#xff0c;装好了Gitstats但自…

基于金枪鱼群算法的无人机航迹规划-附代码

基于金枪鱼群算法的无人机航迹规划 文章目录 基于金枪鱼群算法的无人机航迹规划1.金枪鱼群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用金枪鱼群算法来优化无人机航迹规划。 …