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.xdnf.cn/news/1559489.html

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

相关文章

叉车毫米波雷达防撞技术,保护叉车作业安全

在叉车作业频繁的仓库与物流中心&#xff0c;安全隐患往往隐藏于细微之处&#xff0c;稍有不便可能引发重大事故。我们的叉车毫米波防撞系统方案&#xff0c;正是针对这一痛点而精心设计的创新之作。该系统通过集成的毫米波雷达技术&#xff0c;实现了对叉车周边环境的实时、精…

实时开放词汇目标检测(论文复现)

实时开放词汇目标检测&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 实时开放词汇目标检测&#xff08;论文复现&#xff09;概述模型框架使用方式配置环境训练和评估训练评估 演示效果Gradio Demo 概述 YOLO-World是由腾讯人工智能实验…

应急响应:DHCP$DNS劫持实战

目录 DHCP DHCP安全性&#xff1a; DHCP常见的攻击手段&#xff1a; DNS DNS常见的攻击方式&#xff1a; DNS&DHCP攻击实战演练&#xff1a; 环境配置&#xff1a; 利用&#xff1a; 排查&#xff1a; 防御&#xff1a; DHCP 介绍&#xff1a; DHCP&#xff08;…

前端开发基础NodeJS+NPM基本使用(零基础入门)

文章目录 1、Nodejs基础1.1、NodeJs简介1.2、下载安装文件1.3、安装NodeJS1.4、验证安装2、Node.js 创建第一个应用2.1、说明2.2、创建服务脚本2.3、执行运行代码2.4、测试访问3、npm 基本使用3.1、测试安装3.2、配置淘宝npm镜像3.3.1、本地安装3.3.2、全局安装3.4、查看安装信…

解数独Python

怎样解数独&#xff1f; Python def setBoardFunc(puz): global grid print("Original Sudoku") for i in range(0, len(puz), 9): row puz[i:i9] temp [] for block in row: temp.append(int(block)) g…

小程序知识付费的优势 知识付费服务 知识付费平台 知识付费方法

在信息爆炸的时代&#xff0c;知识如同繁星点点&#xff0c;璀璨而散落。如何在这片知识的海洋中精准捕捞&#xff0c;成为现代人追求自我提升的迫切需求。小程序知识付费&#xff0c;正是这样一座桥梁&#xff0c;它以独特的优势&#xff0c;让智慧触手可及&#xff0c;轻触未…

视频流媒体解决方案,Liveweb国标GB28181视频监控汇聚平台

Liveweb视频监控国标平台指的是基于GB/T 28181协议的视频联网平台&#xff0c;可以对接各种符合国标GB/T 28181协议的视频平台、NVR录像机、网络监控摄像头、执法记录仪、应急布控球、移动单兵、无人机等设备。通过国标平台的联网&#xff0c;方便管理分布在不同地点的视频监控…

笔记 2024/10/9

计组 定点数运算 补码加减法 以及判断溢出方法 原码乘法 下图是手算乘法 下图是原码乘法 因为[Y]原1.10111&#xff0c;所以Y0从低位开取&#xff0c;分别是1&#xff0c;1&#xff0c;1&#xff0c;0&#xff0c;1。&#xff08;或者说C里面存的原来渐渐被挤掉的[Y]原的低…

评职称需要讲究方法

评职称需要讲究方法 评职称不要太老实 你评三年没下来 你同事走“野路子” 一年就下来了 所以别吃亏了 不走的弯路别走 不该吃的苦别吃 大家如果对于职称评审业绩材料整理还有什么不懂的&#xff0c;可以在评论区留言&#xff0c;甘建二告诉你们怎么报职称&#xff0c;少…

力扣11-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

flask发送邮件

开通邮件IMAP/SMTP服务 以网易邮箱为例 点击开启发送验证后会收到一个密钥&#xff0c;记得保存好 编写代码 安装flask-mail pip install flask-mail在config.py文件中配置邮件信息 MAIL_SERVER&#xff1a;邮件服务器 MAIL_USE_SSL&#xff1a;使用SSL MAIL_PORT&#…

SpringBoot开发——整合Actuator监控和管理Spring Boot 应用

文章目录 1、Spring Boot Actuator2、启用Spring Boot Actuator2.1项目中添加Spring Boot Actuator依赖2.2 启动项目,查看监控信息3、Spring Boot Actuator提供的端点(Endpoints)3.1 端点列表3.2 启用终端节点3.3 暴露端点3.4 常用端点详解1、Spring Boot Actuator Spring …

Umi中的微前端

umi/max 内置了 Qiankun 微前端插件&#xff0c;它可以一键启用 Qiankun 微前端开发模式&#xff0c;帮助您轻松地在 Umi 项目中集成 Qiankun 微应用&#xff0c;构建出一个生产可用的微前端架构系统。 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代…

腾讯云SDK 下载

产品体验 App 移动端-腾讯云音视频 App 您可以下载腾讯云音视频 App&#xff0c;体验音视频终端 SDK 产品家族中各个子产品 SDK 的应用场景。 平台 iOS Android Demo 体验 &#xfeff; &#xfeff;&#xfeff;&#xfeff; &#xfeff;&#xfeff; Web 端-Web D…

88、Python之鸭子类型:函数是对象,对象也可以像函数一样使用

引言 在前面的文章中&#xff0c;我们曾经反复提及的理念&#xff0c;“Python中一切皆对象”。在这个理念支持下&#xff0c;Python中的函数也是对象的一种&#xff0c;那么我们有没有办法自定义对象&#xff0c;像函数一样来使用呢。 按照鸭子类型的理念来看&#xff0c;如…

【Delphi】使用并行数组和有序字典加快 Delphi RTL 速度(D12.2)

Delphi 12.2新增功能比较多&#xff0c;但 Delphi 运行时库&#xff08;RTL&#xff09;中的一些增强功能值得一提。比如: 新 TParallelArray 类 System.Threading 单元中有一个新的 TParallelArray 类&#xff0c;可以在数组项上并行运行 &For 和排序等操作。 在多核系统…

【有啥问啥】 群体智能(Swarm Intelligence):从自然到人工智能的深度探索

群体智能&#xff08;Swarm Intelligence&#xff09;&#xff1a;从自然到人工智能的深度探索 什么是群体智能&#xff1f; 群体智能&#xff08;Swarm Intelligence&#xff09;是一个迷人的研究领域&#xff0c;它专注于社会性生物&#xff08;如蚂蚁、蜜蜂、鸟类等&#…

ML 系列:机器学习和深度学习的深层次总结(16) — 提高 KNN 效率-使用 KD 树和球树实现更快的算法

一、说明 在机器学习系列的第 16 节&#xff0c;我们重点介绍了提高 K 最近邻 &#xff08;KNN&#xff09; 算法的效率&#xff0c;这是一种广泛用于分类和回归任务的方法。虽然 KNN 简单有效&#xff0c;但对于大型数据集来说&#xff0c;其计算成本可能会令人望而却步。为了…

实验室认证需要准备哪些文件材料?

实验室认证需要准备的文件材料通常包括以下几类&#xff1a; 一、法律地位文件 实验室成立文件及营业执照&#xff1a;包括实验室的成立证明文件、单位营业执照等&#xff0c;以证明实验室的法律地位和合法性。 人员任命文件&#xff1a;最高管理者&#xff08;如总经理&…

Android 10.0 修改Systemui三键导航栏虚拟按键颜色功能实现

1.前言 在10.0的系统ROM定制化开发中,在对systemui的相关定制化开发中,在某些产品中,需要修改相关的 导航栏三键导航的虚拟按键的颜色,修改掉原来默认的虚拟按键的黑白色,接下来就来实现相关的功能 2.修改Systemui三键导航栏虚拟按键颜色功能实现的核心类 frameworks\ba…