阿里云对象存储OSS
介绍
- 阿里云对象存储OSS是一款非常强大的云存储服务——提供的海量、安全、低成本、高持久性的对象存储服务,通过RESTful API提供HTTP接口。
- 核心特性:
- 无限扩展:存储空间和文件数量无上限。
- 多存储类型:提供标准、低频访问、归档、冷归档、深度冷归档等多种存储类型,覆盖从热到冷的全部数据场景。
- 高安全性:提供多种加密方式(服务器端/客户端)、权限控制、WORM(一次写入,多次读取)特性,满足合规要求。
- 智能处理:内置图片处理、视频截帧等媒体处理功能。
- 优势:
- 稳定可靠:支持大规模场景。
- 成本优化:按量付费,无最低消费,支持生命周期管理自动转换存储类型以节约成本。
- 简单易用:提供控制台、命令行工具、图形化工具及多种语言SDK,方便管理。
- 应用场景
- 网站/应用的动静分离,存储静态资源(图片、音视频、文档等)。
- 静态网站托管。
- 数据备份与归档,结合生命周期管理降低长期存储成本。
- 大数据分析与AI的底层数据湖存储。
- 核心概念
- 存储空间:存储文件(对象)的容器,名称在
OSS范围内必须全局唯一。可设置其所在地域、访问权限和存储类型等属性。
- 对象/文件:这是OSS存储数据的基本单元,由数据本身、
元数据和键key组成。键可理解为文件的唯一标识,可包含类似目录结构的后缀(如 data/images/logo.jpg)来模拟文件夹层级
- 地域:指OSS的数据中心所在的物理位置——用户离地域越近访问速度越快。
- 使用方式:控制台、命令行工具、SDK、图形化桌面工具。
Java代码
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.11.2</version>
</dependency>
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
public class OSSConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
@Bean(destroyMethod = "shutdown")
public OSS ossClient() {
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.yyds.admin.config.OSSConfig;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@Service
@RequiredArgsConstructor
public class OSSService {
private final OSS ossClient;
private final OSSConfig ossConfig;
public static final String POINT = ".";
/**
* 上传文件
*
* @param file 文件
* @param filePath 存放的路径
* @return 文件路径
*/
public String uploadFile(MultipartFile file, String filePath) {
try {
ossClient.putObject(ossConfig.getBucketName(), filePath, file.getInputStream());
/* 方式二:指定访问文件时的打开方式
指定文件访问时的默认打开方式——如pdf文件,使用阿里云oss提供的默认域名访问文件时默认是下载,而不是预览。
由于阿里云oss为自身安全考虑访问所使用策略,如需默认打开是预览,需要配置自己的域名进行访问。
以下代码使用自定义域名访问时生效,使用阿里云oss提供的默认域名访问文件时将失效——阿里云oss平台策略优先级比代码控制高。
PutObjectRequest request = new PutObjectRequest(ossConfig.getBucketName(), filePath, file.getInputStream());
// 创建元数据对象并设置关键属性:Content-Type (MIME类型)、Content-Disposition
ObjectMetadata metadata = new ObjectMetadata();
// 1、设置访问是预览模式 inline
metadata.setContentDisposition("inline");
// 2、设置访问是下载模式 attachment
metadata.setContentDisposition("attachment");
metadata.setContentType("application/pdf");
request.setMetadata(metadata);
ossClient.putObject(request);
*/
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
return "https://" + ossConfig.getBucketName() + POINT + ossConfig.getEndpoint() + File.separator + filePath;
}
/**
* 下载文件 以字节数组形式返回 根据完整的path下载
* @param filePath 下载文件路径 如:https://guangzhou.aliyuncs.com/data/pdf/2025/10/7/2345.pdf
* @return 字节数组
*/
public byte[] downLoad(String filePath) {
try {
OSSObject object = ossClient.getObject(new GetObjectRequest(ossConfig.getBucketName(), formatPath(filePath)));
InputStream stream = object.getObjectContent();
return stream.readAllBytes();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* 指定路径文件上传
* @param file 文件
* @param filePath 指定路径 如:http://guangzhou.aliyuncs.com/data/pdf/2025/10/7/2345.pdf
* @return 完整文件路径
*/
public String uploadFileAttachPath(MultipartFile file, String filePath) {
try {
ossClient.putObject(ossConfig.getBucketName(), formatPath(filePath), file.getInputStream());
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
return filePath;
}
/**
* 删除文件
* @param filePath 文件路径
*/
public void deleteFile(String filePath) {
try {
ossClient.deleteObject(ossConfig.getBucketName(), formatPath(filePath));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* 根据路径获取不包含Bucket名称在内的Object完整路径:data/pdf/2025/10/7/2345.jpg
* @param filePath 文件路径
*/
public String formatPath(String filePath) {
String path = "https://" + ossConfig.getBucketName() + POINT + ossConfig.getEndpoint() + File.separator;
return filePath.replace(path, "");
}
}