SpringBoot 整合 阿里云 OSS图片上传

news2024/11/27 1:26:20

一、OOS 简介

‌阿里云OSS(Object Storage Service)是一种基于云存储的产品,适用于存储和管理各种类型的文件,包括图片、视频、文档等。‌ 阿里云OSS具有高可靠性、高可用性和低成本等优点,因此被广泛应用于各种场景,包括作为图片服务器‌。

阿里云OSS图片服务提供了多种功能,包括图片信息获取、格式转换、缩放、裁剪、旋转等。用户可以通过简单的RESTful接口在任何时间、任何地点对图片进行处理。此外,阿里云OSS还支持通过URL形式进行图片处理,用户可以通过URL中的QueryString指定处理参数,直接访问处理后的图片,这种方式简单方便,无需编写额外的代码‌。

二、官网开通服务

1.官网账号注册

阿里云官网阿里云——阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司之一。提供免费试用、云服务器、云数据库、云安全、云企业应用等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。免费备案,7x24小时售后支持,助企业无忧上云。icon-default.png?t=O83Ahttps://www.aliyun.com/

2.开通OSS服务

(1)点击产品

(2)选择存储就可以看到OSS了

(3)点击OSS进入,选择开通

(4)点击开通之后进入以下,点击立即购买

(5)同意服务,点击去支付

(6)点击支付

(7)成功后点击控制台

(8)点击Bucket(桶)列表

(9)点击创建Bucket(桶)

注意事项:

(10)填写数据

a.名称

b.地域(尽量选离自己比较近的速度会快一些)

c.配置(读写权限要选公共度,其他根据需求来)

创建成功

3.获取AccessKey

(1)点击右上头像,选择AccessKey管理

(2)点击进入之后会弹出一个警告,这里我选 继续使用AccessKey

(3)创建AccessKey

a.安全认证(两种认证方式都行)

b.认证之后,就创建成功了

切记:生成之后要保存好两个AccessKey,后面无法进行查询

二、SpringBoot整合并使用
Java_对象存储(OSS)-阿里云帮助中心icon-default.png?t=O83Ahttps://help.aliyun.com/zh/oss/developer-reference/java/

1.导入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

2.添加配置

aliyun:
  oss:
    # OSS服务的节点地址,指定为上海区域
    endPoint: oss-cn-shanghai.aliyuncs.com
    # 用户的Access Key ID,用于身份验证
    accessKeyId: 
    # 用户的Access Key Secret,用于身份验证
    accessKeySecret: 
    # 访问OSS资源的基础URL
    accessPre: https://051104.oss-cn-shanghai.aliyuncs.com/
    # 存储桶的名称,存储数据的地方
    bucketName: 

配置信息所在地

a.OSS服务的节点地址

进入创建的bucket桶中,点击概览,往下滑就可以看到

b.用户的Access Key ID 和 用户的Access Key Secret

就是创建的accesskey,再次提醒切记要保存accesskey

c.访问OSS资源的基础URL

跟OSS服务的节点地址差不多在同一个地方 ,进入创建的bucket桶中,点击概览,往下滑就可以看到

将配置中红框中的改成自己的

d.存储桶的名称

就是创建bucket(桶)时自己起的名字

3.创建初始化bean

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PreDestroy;

/**
 * OSS初始化配置
 */
@Log4j2
@Configuration
public class OssConfig {
    /**
     * 配置文件中读取阿里云 OSS 的 endpoint,注入到 endPoint 变量中
     */
    @Value("${aliyun.oss.endPoint}")
    private String endPoint;

    /**
     * 从配置文件中读取阿里云 OSS 的 accessKeyId,注入到 accessKeyId 变量中
     */
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    /**
     * 从配置文件中读取阿里云 OSS 的 accessKeySecret,注入到 accessKeySecret 变量中
     */
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    private OSS ossClient;

    @Bean
    public OSS init() {
        // 如果 OSS 客户端尚未初始化,则进行初始化
        if (ossClient == null) {
            // 使用 OSSClientBuilder 构建 OSS 客户端,传入 endpoint、accessKeyId 和 accessKeySecret
            ossClient = createOSSClient();

            // 记录日志,表示连接成功
            log.info("OSS服务连接成功!");
        }
        // 返回初始化好的 OSS 客户端实例
        return ossClient;
    }

    /**
     * 创建 OSS 客户端的方法
     */
    private OSS createOSSClient() {
        return new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
    }

    @PreDestroy
    public void destroy() {
        // 关闭 OSS 客户端
        if (ossClient != null) {
            // 调用 shutdown() 方法关闭 OSS 客户端
            ossClient.shutdown();

            // 记录日志,确认客户端已成功关闭
            log.info("OSS客户端已成功关闭。");
        }
    }
}

4.创建上传工具类

import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * OSS 文件管理服务
 */
@Log4j2
@Component
public class OssUtil {

    /** 自动注入 OssConfig 类型的 Bean */
    @Autowired
    private OssConfig ossConfig;

    /** 定义访问前缀,用于构建文件的完整访问路径 */
    @Value("${aliyun.oss.accessPre}")
    private String accessPre;

    /** 定义存储桶名称,方便在上传和下载时引用 */
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    /**
     * 默认路径上传本地文件
     *
     * @param filePath 本地文件路径
     * @return 上传后的文件访问路径
     */
    public String uploadFile(String filePath) {
        return uploadFileForBucket(bucketName, getOssFilePath(filePath), filePath);
    }

    /**
     * 默认路径上传 MultipartFile 文件
     *
     * @param multipartFile 待上传的文件
     * @return 上传后的文件访问路径
     */
    public String uploadMultipartFile(MultipartFile multipartFile) {
        return uploadMultipartFile(bucketName, getOssFilePath(multipartFile.getOriginalFilename()), multipartFile);
    }

    /**
     * 上传 MultipartFile 类型文件到指定 Bucket
     *
     * @param bucketName    实例名称
     * @param ossPath       OSS 存储路径
     * @param multipartFile 待上传的文件
     * @return 上传后的文件访问路径
     */
    public String uploadMultipartFile(String bucketName, String ossPath, MultipartFile multipartFile) {
        try (InputStream inputStream = multipartFile.getInputStream()) {
            uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        } catch (IOException e) {
            log.error("上传文件失败: {}", e.getMessage(), e);
            return null;
        }
        return accessPre + ossPath;
    }

    /**
     * 使用 File 上传文件
     *
     * @param bucketName 实例名称
     * @param ossPath    OSS 存储路径
     * @param filePath   本地文件路径
     * @return 上传后的文件访问路径
     */
    public String uploadFileForBucket(String bucketName, String ossPath, String filePath) {
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));
        ossConfig.init().putObject(putObjectRequest);
        return accessPre + ossPath;
    }

    /**
     * 使用文件流上传到指定的 Bucket 实例
     *
     * @param bucketName  实例名称
     * @param ossPath     OSS 存储路径
     * @param inputStream 文件输入流
     */
    public void uploadFileInputStreamForBucket(String bucketName, String ossPath, InputStream inputStream) {
        ossConfig.init().putObject(bucketName, ossPath, inputStream);
    }

    /**
     * 下载文件
     *
     * @param ossFilePath OSS 存储路径
     * @param filePath    本地文件路径
     */
    public void downloadFile(String ossFilePath, String filePath) {
        downloadFileForBucket(bucketName, ossFilePath, filePath);
    }

    /**
     * 从指定 Bucket 下载文件
     *
     * @param bucketName  实例名称
     * @param ossFilePath OSS 存储路径
     * @param filePath    本地文件路径
     */
    public void downloadFileForBucket(String bucketName, String ossFilePath, String filePath) {
        ossConfig.init().getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));
    }

    /**
     * 获取默认 OSS 存储路径
     *
     * @return 默认 OSS 存储路径
     */
    public String getOssDefaultPath() {
        LocalDateTime now = LocalDateTime.now();
        return String.format("%d/%d/%d/%d/%d/",
                now.getYear(),
                now.getMonthValue(),
                now.getDayOfMonth(),
                now.getHour(),
                now.getMinute());
    }

    /**
     * 生成 OSS 文件路径
     *
     * @param filePath 本地文件路径
     * @return OSS 文件路径
     */
    public String getOssFilePath(String filePath) {
        String fileSuffix = filePath.substring(filePath.lastIndexOf(".") + 1);
        return getOssDefaultPath() + UUID.randomUUID() + "." + fileSuffix;
    }
}

5.调用上传方法上传图片

import com.chen.system.config.OssUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * OSS 文件控制器
 */
@RestController
@RequestMapping("/oss")
public class OssController {
    @Autowired
    private OssUtil ossUtil;

    @PostMapping("/showImg")
    public String upload(MultipartFile file){
        return ossUtil.uploadMultipartFile(file);
    }
}

6.测试

(1)postman测试

(2)浏览器访问链接

访问之后会直接弹出下载框(没有弹出来直接下载的,可能是浏览器没有设置下载时询问)

下载之后

(3)OSS控制台

在bucket列表中找到上传时指定的bucket点击也可查看上传图片呢

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

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

相关文章

能源监控大数据界面,洞察一切生产态势

能源监控大数据界面犹如一扇洞察一切生产态势的神奇之窗。在这个界面上&#xff0c;丰富的数据以直观的图表、动态的图形和醒目的数字呈现出来。 通过色彩鲜明的仪表盘&#xff0c;能清晰地了解能源的实时消耗情况&#xff0c;红色区域的警示提醒着可能存在的能源浪费或异常情…

【exp报错注入】

整数范围 最大整数 exp 函数介绍 报错盲注注入 payload分析 709C-ASCII 值就等于我们下面的 7091-1 &#xff0c;C就是我们要猜的值&#xff0c;当我们猜测的值和ASCII码相等时&#xff0c;那么exp就不会出现报错&#xff0c;因为1-1还是等于709&#xff1a; 练习 id1 an…

wordpress使用popup弹窗插件的对比

您在寻找最好的 WordPress 弹出插件吗&#xff1f;大多数网站利用某种形状或形式的弹出窗口来将访问者指向他们希望他们去的地方。例如&#xff0c;这可能用于结帐、电子邮件订阅或用于生成潜在客户。 表现 弹出插件会减慢您的网站速度。当插件使用 WordPress 跟踪弹出窗口的…

《网络安全自学教程》- Nmap使用及扫描原理分析

《网络安全自学教程》 Nmap&#xff08;Network Mapper&#xff09;是一款免费的开源网络扫描器&#xff0c;向目标主机发送特定的数据包&#xff0c;根据返回的流量特征&#xff0c;分析主机信息。主要功能有&#xff1a;「端口扫描」、「主机探测」、「服务识别」和「系统识别…

数学建模算法与应用 第3章 非线性规划及其求解方法

目录 3.1 非线性规划概述 3.2 约束优化问题 3.3 无约束优化问题的Matlab求解 3.4 牛顿法与梯度下降法 Matlab代码示例&#xff1a;梯度下降法求解简单非线性问题 3.5 非线性规划在机器学习中的应用 习题 3 总结 非线性规划&#xff08;Nonlinear Programming, NLP&…

Vue3入门学习

Vue3入门学习 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options…

【源码+文档+调试讲解】二手物品调剂系统NODEJS

摘 要 二手物品调剂系统是一种在线平台&#xff0c;旨在促进用户之间的二手物品交易。该系统提供了一个方便的界面&#xff0c;让用户能够发布、浏览和搜索二手物品信息。用户可以根据自己的需求和兴趣&#xff0c;筛选出合适的物品&#xff0c;并通过系统与卖家进行联系。系统…

MES 系统在制造业数字化转型中的关键角色_SunMES

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 在制造业数字化转型的宏大进程中&#xff0c;MES&#xff08;制造执行系统&#xff09;系统扮演着举足轻重的角色。 首先&#xff0c;MES 系统是数据采集与整合的…

QDateTime 使用详解

QDateTime 是 Qt 框架中用于处理日期和时间的类。本篇文章详细介绍、通过示例 快速了解QDateTime的各种操作&#xff0c;包括: 当前时间、获取日期和时间、获取日期、获取时间、获取时间戳、格式化输出、年、月、日、QTime时间、获取微妙、操作日期和时间、添加时间、减去时间、…

搭建 golang 项目的目录介绍及其用途对比表

文章目录 1.目录细则表2.目录使用说明及典型内容2.例 K8S 源码目录编排 1.目录细则表 常见 Go 项目目录的作用、典型内容、文件类型和使用场景~ 目录名作用/用途常见文件类型使用场景及详细说明典型内容举例cmd/存放可执行文件的入口点&#xff0c;通常为项目主程序入口或工具…

SAP_FI模块-公司间资产转移ABT1N操作

业务背景&#xff1a; 1、用户在OA走公司间资产的转移流程时&#xff0c;提示错误以下错误&#xff1b; 通过与OA开发的同事沟通发现&#xff0c;调用的接口是自开发的这个&#xff1a;ZFIF_AA_TRANSFER_POST&#xff0c;使用的是BDC录屏的方式&#xff0c;真正执行的事务码是A…

重学SpringBoot3-集成Redis(一)之基础功能

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;一&#xff09;之基础功能 1. 项目初始化2. 配置 Redis3. 配置 Redis 序列化4. 操作 Redis 工具类5. 编写 REST 控制器6. 测试 AP…

DAMA数据管理知识体系(第12章 元数据管理)

课本内容 12.1 引言 图12-1 语境关系图&#xff1a;元数据概念理解 元数据的信息范围很广&#xff0c;不仅包括技术和业务流程、数据规则和约束&#xff0c;还包括逻辑数据结构与物理数据结构等。它描述了数据本身&#xff08;如数据库、数据元素、数据模型&#xff09;&#x…

MokeJs使用实例

文章目录 MokeJs使用实例介绍使用安装配置文件导入配置到main.js使用 axios 发送网络请求测试&#xff08;如果不会axios&#xff0c;具体可以见上篇文章axios&#xff09;启动示例 MokeJs使用实例 介绍 使用 安装 npm install mockjs --save-dev # 或者 yarn add mockj…

python画图|两个Y轴共享X轴

【1】引言 在前述学习中&#xff0c;对使用matplotlib模块输出图形已经非常熟练&#xff0c;但常见的画图方式并未穷尽&#xff0c;如两个Y轴共享X轴就没有探索过。 对此&#xff0c;我进行了一些学习&#xff0c;获得一些心得&#xff0c;在此和大家共享。 【2】官网教程 …

点评项目-4-隐藏敏感信息、使用 redis 优化登录业务

一、隐藏敏感信息 之前我们对 /user/me 路径&#xff0c;直接返回了登录的所有用户信息&#xff0c;其中的 passward 等敏感信息也会被返回到前端&#xff0c;这是很危险的&#xff0c;故我们需要选择性的返回用户信息&#xff0c;隐藏敏感用户信息 我们可以创建一个 UserDTO…

ECCV`24 | 新加坡国立华为提出Vista3D: 实现快速且多视角一致的3D生成

文章链接&#xff1a;https://arxiv.org/pdf/2409.12193 gitbub链接&#xff1a;https://github.com/florinshen/Vista3D 亮点直击 提出了Vista3D&#xff0c;一个用于揭示单张图像3D darkside 的框架&#xff0c;能够高效地利用2D先验生成多样的3D物体。开发了一种从高斯投影到…

43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、realloc、_msize、free)、内存泄漏

目录 1 C 程序内存区域划分 1.1 代码区 (Code Section) 1.2 全局/静态区 (Global/Static Section) 1.3 栈区 (Stack Section) 1.4 堆区 (Heap Section) 1.5 动态内存分配 2 void 指针&#xff08;无类型指针&#xff09; 2.1 void 指针介绍 2.2 void 指针的作用 2.3 …

Web自动化Demo-Go+Selenium

1.新建工程 使用GoLand新建工程如下&#xff1a; 打开终端输入如下命令安装Selenium go get -u github.com/tebeka/selenium 2.编写代码 package mainimport ("fmt""github.com/tebeka/selenium""log""time" )const (chromeDriver…

视频生成的黎明:100+页干货全面探讨SORA类模型(T2VI2VV2V全包括)腾讯中科大

日前&#xff0c;腾讯AI Lab和中科大联合发布了100多页的类SORA模型研究报告&#xff0c;非常全面&#xff0c;很有学习和研究价值&#xff0c;今天和大家分享下&#xff0c;内容较多&#xff0c;可后台回复【类SORA报告】获取100多页pdf。 开源地址&#xff1a;https://ailab-…