阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。阿里云OSS将数据文件以对象(object)的形式上传到存储空间(bucket)中。
您可以进行以下操作:
- 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。
- 通过获取已上传文件的地址进行文件的分享和下载。
- 通过修改存储空间或文件的属性或元信息来设置相应的访问权限。
- 在阿里云管理控制台执行基本和高级OSS任务。
- 使用阿里云开发工具包或直接在应用程序中进行RESTful API调用执行基本和高级OSS任务
前期准备
1.直接搜索oss服务,第一次使用的话需要开通
地址 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
2.创建存储空间
新建Bucket,命名自己起
创建成功如下
注意 把读写改为公共读,否则无法访问
大概步骤如下
在yaml中引入依赖 安装OSS Java SDK_对象存储(OSS)-阿里云帮助中心
导入依赖
<!--阿里云OSS依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<!--支持配置属性类,yml文件中可以提示配置项-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
springboot启动时会把yml文件加载到2里面的类中AliOssProperties
由于都交给了bean容器所以能加载出来
1.设置yml里面的配置
# 阿里云oss
aliyun:
oss:
endpoint: https://xxxxxxxxxxx
access-key-id: xxxxxxxxxx
access-key-secret: xxxxxxxxxx
bucket-name: xxxxxxxx
endpoint是你的地域地址
是指云存储服务的接入点,即您要连接的服务器地址。不同的区域(Region)会有不同的 endpoint
注意access-key-id access-key-secret千万不能泄露
access-key-id:
access-key-id
是一个标识符,用于唯一识别您的云账户。它是您与云服务进行身份验证的一部分。- 作用:当您向云存储服务发起请求时,
access-key-id
用于告诉云服务“这是谁在发送请求”。它类似于用户名,但并不是直接用于登录的凭据,而是用于生成签名的一部分
access-key-secret:
- 含义:
access-key-secret
是与access-key-id
配对的秘密密钥,用于对请求进行签名,以确保请求的完整性和真实性。 - 作用:每次您向云存储服务发送请求时,都需要使用
access-key-secret
来生成一个 HMAC-SHA1 或其他类型的签名。云服务会验证这个签名,以确认请求确实来自拥有该access-key-id
的用户,并且请求内容未被篡改。
一定要保存好这对密钥
把这对密钥配置到yaml文件中即可
bucket-name:
你创建Bucket的名称
2.创建加载类
用于加载和管理阿里云 OSS(Object Storage Service)的相关配置属性。通过 @ConfigurationProperties
注解,可以将应用程序的配置文件(如 application.yml
或 application.properties
)中的属性自动映射到 Java 类的字段中。这使得配置管理和依赖注入变得更加简洁和方便
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOssProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
3.使用工具类
- 功能:接收一个
MultipartFile
对象(即上传的文件),将其上传到阿里云 OSS,并返回文件的访问 URL。 - 步骤:
-
- 获取配置信息:从
AliOssProperties
中读取 OSS 的endpoint
、accessKeyId
、accessKeySecret
和bucketName
。 - 文件大小校验:检查文件是否为空,以及文件大小是否超过预定义的最大值。如果文件不符合要求,抛出异常并阻止上传。
- 创建 OSS 客户端:使用
OSSClientBuilder
创建一个 OSS 客户端实例。 - 获取文件输入流:从
MultipartFile
中获取文件的输入流,准备上传。 - 生成唯一文件名:为了避免文件名冲突,使用
UUID
生成一个全局唯一的文件名,并保留原始文件的扩展名。 - 上传文件:调用
ossClient.putObject
方法将文件上传到指定的 OSS 存储桶。 - 生成文件访问 URL:上传成功后,调用
generateFileUrl
方法生成文件的访问 URL。 - 返回文件 URL:将生成的文件 URL 返回给调用者。
- 异常处理:捕获并处理可能发生的 I/O 异常和其他类型的异常。
- 关闭 OSS 客户端:无论上传是否成功,确保在
finally
块中关闭 OSS 客户端,释放资源。
- 获取配置信息:从
@Component
public class AliOSSUtils {
@Autowired
private AliOssProperties aliOssProperties;
// 限制最大文件大小(例如 10MB)
private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取配置信息
String endpoint = aliOssProperties.getEndpoint();
String accessKeyId = aliOssProperties.getAccessKeyId();
String accessKeySecret = aliOssProperties.getAccessKeySecret();
String bucketName = aliOssProperties.getBucketName();
// 检查文件是否为空
if (file.isEmpty()) {
throw new IllegalArgumentException("文件不能为空");
}
// 检查文件大小是否超过限制
if (file.getSize() > MAX_FILE_SIZE) {
throw new IllegalArgumentException("文件大小超过限制(" + MAX_FILE_SIZE / (1024 * 1024) + "MB)");
}
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
if (originalFilename == null) {
throw new IllegalArgumentException("文件名不能为空");
}
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 上传文件到 OSS
ossClient.putObject(bucketName, fileName, inputStream);
// 文件访问路径
String url = generateFileUrl(fileName);
return url; // 把上传到oss的路径返回
} catch (IOException e) {
throw new IOException("文件上传失败: " + e.getMessage(), e);
} catch (Exception e) {
throw new RuntimeException("文件上传过程中发生错误: " + e.getMessage(), e);
} finally {
// 关闭 OSS 客户端
ossClient.shutdown();
}
}
/**
* 生成文件的访问 URL
*/
private String generateFileUrl(String fileName) {
String endpoint = aliOssProperties.getEndpoint();
String bucketName = aliOssProperties.getBucketName();
// 如果 endpoint 包含协议(如 http:// 或 https://),则直接使用
if (endpoint.startsWith("http://") || endpoint.startsWith("https://")) {
return String.format("%s/%s", endpoint, fileName);
} else {
// 如果 endpoint 不包含协议,则默认使用 https
return String.format("https://%s.%s/%s", bucketName, endpoint, fileName);
}
}
}
controller
@RestController
@RequestMapping("/api")
public class FileUploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
/**
* 处理文件上传请求
*/
@PostMapping("/upload")
public BaseResponse<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 调用 AliOSSUtils 的 upload 方法上传文件
String url = aliOSSUtils.upload(file);
return ResultUtils.success(url);
} catch (IOException e) {
// 捕获并处理上传过程中可能发生的 I/O 异常
return null;
} catch (Exception e) {
// 捕获并处理其他类型的异常
return null;
}
}
}
使用knife4j接口文档访问后端地址测试即可
去阿里云oss查看是否上传成功
还可进一步简化 参考X File Storage官方文档即可,这里不做赘述