SpringBoot 整合 阿里云 OSS图片上传

一、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资源的基础URLaccessPre: 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;@Beanpublic OSS init() {// 如果 OSS 客户端尚未初始化,则进行初始化if (ossClient == null) {// 使用 OSSClientBuilder 构建 OSS 客户端,传入 endpoint、accessKeyId 和 accessKeySecretossClient = createOSSClient();// 记录日志,表示连接成功log.info("OSS服务连接成功!");}// 返回初始化好的 OSS 客户端实例return ossClient;}/*** 创建 OSS 客户端的方法*/private OSS createOSSClient() {return new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);}@PreDestroypublic 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 */@Autowiredprivate 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 {@Autowiredprivate OssUtil ossUtil;@PostMapping("/showImg")public String upload(MultipartFile file){return ossUtil.uploadMultipartFile(file);}
}

6.测试

(1)postman测试

(2)浏览器访问链接

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

下载之后

(3)OSS控制台

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

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

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

相关文章

简单的网络爬虫爬取视频

示例代码爬取一个周杰伦相关视频 import requests# 自己想下载的视频链接 video_url https://vdept3.bdstatic.com/mda-qg8cnf4bw5x6bjs5/cae_h264/1720516251158906693/mda-qg8cnf4bw5x6bjs5.mp4?v_from_shkapp-haokan-hbf&auth_key1728497433-0-0-4a32e13f751e04754e4…

oracle-函数-instr()的妙用以及相似功能like

INSTR(C1,C2[,I[,J]]) 【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置; 【说明】多字节符(汉字、全角符等)&#xff0c;按1个字符计算 【参数】 C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 第J次出现的位置,默认为1 【…

算法修炼之路之位运算

目录 一:位运算符及一些常用结论总结 1.给一个数n&#xff0c;确定它的二进制表示中的第x位是0还是1(位数从右向左0开始增加) 2.将一个数n的二进制表示形式的第x位修改成1 3.将一个数n的二进制表示的第x位修改为0 4.提取一个数n的二进制表示中最右侧的1 5.干掉一个数n的…

单片机闪存,闪存缓冲取,闪存延迟

一、启用闪存预取缓冲区&#xff08;FLASH_PrefetchBufferCmd (FLASH_PrefetchBuffer_Enable);&#xff09; 闪存预取缓冲区的作用&#xff1a; 在微控制器中&#xff0c;闪存是用于存储程序代码和常量数据的非易失性存储器。当微控制器执行程序时&#xff0c;需要从闪存中读取…

kubernetes-强制删除命名空间

一、故障现象 1、删除命名空间卡住、强制删除也卡住 2、其他终端显示命名空间下无资源 二、处理步骤 1、kubectl get namespace cilium-test -o json > temp.json 获取你需要删除的命名空间json描述文件。 2、修改finalize字段 3、替换 kubectl replace --r…

OmniH2O——通用灵巧且可全身远程操作并学习的人形机器人(其前身H2O是HumanPlus的重要参考)

前言 由于我司一直在针对各个工厂、公司、客户特定的业务场景&#xff0c;做解决方案或定制开发&#xff0c;所以针对每一个场景&#xff0c;我们都会反复考虑用什么样的机器人做定制开发 于此&#xff0c;便不可避免的追踪国内外最前沿的机器人技术进展&#xff0c;本来准备…

信息安全工程师(42)VPN类型和实现技术

前言 VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网络&#xff09;是一种在公共网络上建立专用网络连接的技术。 一、VPN类型 VPN可以根据不同的分类标准划分为多种类型&#xff0c;主要包括以下几种&#xff1a; 按协议分类&#xff1a; PPTP&#xff08;Poi…

创建osd加入集群

故障原因&#xff1a;ceph节点一个磁盘损坏&#xff0c;其中osd69 down了&#xff0c;需要更换磁盘并重新创建osd加入ceph集群。 信息采集&#xff1a; 更换磁盘前&#xff0c;查询osd69对应的盘符&#xff1a; 将对应的故障磁盘更换后&#xff0c;并重做raid&#xff0c;然后查…

超轻巧modbus调试助手使用说明

一、使用说明 1.1 数据格式 和其他的modbus采集工具一样&#xff0c;本组件也支持各种数据格式&#xff0c;其实就是高字节低字节的顺序。一般是2字节表示一个数据&#xff0c;后面又有4字节表示一个数据&#xff0c;目前好像还有8字节表示一个数据的设备。不同厂家的设备对应…

C++ | Leetcode C++题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution { public:bool circularArrayLoop(vector<int>& nums) {int n nums.size();auto next [&](int cur) {return ((cur nums[cur]) % n n) % n; // 保证返回值在 [0,n) 中};for (int i 0; i < n; i) {if …

【论文速看】DL最新进展20241009-图像生成、多模态、医学扩散模型、行人重识别

目录 【图像生成】【多模态】【医学扩散模型】【行人重识别】 【图像生成】 [2024] CAR: Controllable Autoregressive Modeling for Visual Generation 论文链接&#xff1a;https://arxiv.org/pdf/2410.04671 代码链接&#xff1a;https://github.com/MiracleDance/CAR 可控…

torchvision.transforms.Resize()的用法

今天我在使用torchvision.transforms.Resize()的时候发现&#xff0c;一般Resize中放的是size或者是(size,size)这样的二元数。 这两个里面&#xff0c;torchvision.transforms.Resize((size,size))&#xff0c;大家都很清楚&#xff0c;会将图像的h和w大小都变成size。 但是…

洞察AI趋势:智享AI直播,打造专属你的数字化直播AIGC系统!

洞察AI趋势&#xff1a;智享AI直播&#xff0c;打造专属你的数字化直播AIGC系统&#xff01; 在当今这个日新月异的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的未来科技&#xff0c;而是正深刻改变着我们生活、工作的每一个角落。其中&#xf…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题&#xff0c;但是鉴于网上解决方法基本没有&#xff0c;故记录下来帮助后来者。整篇文章总结下来就是一句话&#xff1a;PyQt5和sip安装过程或安装版本有问题&#xff0c;需要重新安装。 问题与解决方法 如果PyQt5你是正…

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

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

女性议题,正在成为喜综困境?

《脱口秀和Ta的朋友们》&#xff08;以下简称《脱友》&#xff09;与《喜剧之王单口季》&#xff08;以下简称《喜单》&#xff09;两档喜综的对垒&#xff0c;竟然意外走向了同一个落点&#xff1a;对女性视角的收割。 #杨笠 这是血肉在疯长的声音# #杨笠 不是敢说是不知道这…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

洛谷P5648

洛谷P5648 这题花了很长时间&#xff0c;是在线段树题单里找到的&#xff08; &#xff09;。有线段树做法&#xff0c;但是我感觉可能比倍增做法更难看懂。以后有空再看看吧。感觉线段树现在只会板子题&#xff0c;绿稍微难点可能就不会。 花了很久时间之后&#xff0c;就觉得…

【YOLO学习】YOLOv5口罩检测实战

文章目录 1. 环境配置2. 下载代码3. 安装库3.1 安装pytorch3.2 安装其他库 4. 测试5. 数据标注6. 模型训练6.1 一些修改6.2 训练 7. 界面可视化 1. 环境配置 1. 先参考其他文章安装 Anaconda 或者 Miniconda&#xff0c;我安装的是 Miniconda。 2. 更换国内源&#xff0c;以加快…

LLM详解

一 定义 Large Language Model&#xff0c;称大规模语言模型或者大型语言模型&#xff0c;是一种基于大量数据训练的统计语言模型&#xff0c;可用于生成和翻译文本和其他内容&#xff0c;以及执行其他自然语言处理任务&#xff08;NLP&#xff09;&#xff0c;通常基于深度神…