SpringBoot 整合 阿里云 OSS图片上传

news/2024/10/10 10:39:51/

一、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.ppmy.cn/news/1536968.html

相关文章

快速区分 GPT-3.5 与 GPT-4

问&#xff1a;鲁迅为什么暴打周树人&#xff1f; GPT3.5回答 各种稀奇古怪的理由 GPT4回答 正确区分鲁迅和周树人是同一个人 国内GPT入口 https://ai-to.cn/url/?ulihaimao

vue3实现登录获取token并自动刷新token进行JWT认证

在《django应用JWT(JSON Web Token)实战》介绍了如何通过django实现JWT&#xff0c;并以一个具体API接口实例的调用来说明JWT如何使用。本文介绍如何通过vue3的前端应用来使用JWT认证调用后端的API接口&#xff0c;实现一下的登录认证获取JWT进行接口认证。 一、账号密码登录获…

【ROS】机器人系统仿真-URDF集成Rviz基本流程

机器人系统仿真&#xff1a;是通过计算机对实体机器人系统进行模拟的技术&#xff0c;在 ROS 中&#xff0c;仿真实现涉及的内容主要有三:对机器人建模(URDF)、创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现。 1.URDF URDF可以以一种 XML 的方式描述机器人的部分结构&…

Vue.js 组件开发知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

RCE(remote command/code execute)远程命令注入

远程命令注入RCE RCE(remote command/code execute&#xff0c;远程命令执行)漏洞&#xff0c;一般出现这种漏洞&#xff0c;是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口&#xff0c;比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给…

【python机器学习】线性回归 拟合 欠拟合与过拟合 以及波士顿房价预估案例

文章目录 线性回归之波士顿房价预测案例 欠拟合与过拟合线性回归API 介绍:波士顿房价预测数据属性:机器学习代码实现 拟合 过拟合 欠拟合 模拟 及处理方法(正则化处理)导包定义函数表示欠拟合定义函数表示拟合定义函数表示过拟合 正则化处理过拟合L1正则化L2正则化 线性回归之波…

数据交换的金钟罩:合理利用安全数据交换系统,确保信息安全

政府单位为了保护网络不受外部威胁和内部误操作的影响&#xff0c;通常会进行网络隔离&#xff0c;隔离成内网和外网。安全数据交换系统是专门设计用于在不同的网络环境&#xff08;如内部不同网络&#xff0c;内部网络和外部网络&#xff09;之间安全传输数据的解决方案。 使用…

mysql事务使用和事务隔离级别与sqlserver的比较

在 MySQL 中&#xff0c;事务 (Transaction) 是一个将一组 SQL 语句作为一个整体执行的机制。事务确保要么所有操作都执行成功&#xff0c;要么在遇到错误时回滚到之前的状态&#xff0c;从而保证数据库数据的一致性和完整性。 事务的四大特性&#xff08;ACID&#xff09; 事…