一、OOS 简介
阿里云OSS(Object Storage Service)是一种基于云存储的产品,适用于存储和管理各种类型的文件,包括图片、视频、文档等。 阿里云OSS具有高可靠性、高可用性和低成本等优点,因此被广泛应用于各种场景,包括作为图片服务器。
阿里云OSS图片服务提供了多种功能,包括图片信息获取、格式转换、缩放、裁剪、旋转等。用户可以通过简单的RESTful接口在任何时间、任何地点对图片进行处理。此外,阿里云OSS还支持通过URL形式进行图片处理,用户可以通过URL中的QueryString指定处理参数,直接访问处理后的图片,这种方式简单方便,无需编写额外的代码。
二、官网开通服务
1.官网账号注册
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)-阿里云帮助中心https://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点击也可查看上传图片呢