OSS对象存储服务的创建和集成使用

在写项目的时候,使用到了上传文件的一些功能,通过该方式可以提高文件的访问速率。也可以就将文件存储到数据库。这里只是做一个记录。

1. OSS 服务配置

1.1 创建 Bucket

  1. 登录阿里云控制台,进入 OSS 管理界面
  2. 点击"创建 Bucket"
  3. 配置说明:
    • Bucket 名称:air-test1
    • 地域:选择杭州(oss-cn-hangzhou)
    • 存储类型:标准存储
    • 读写权限:公共读(如果不想设置公共读,需要使用签名URL)
    • 版本控制:可选
    • 服务端加密:可选

在这里插入图片描述

1.2 创建后设置

关闭阻止公共访问
在这里插入图片描述
读写权限:公共读

在这里插入图片描述

1.3 访问密钥配置

  1. 在阿里云控制台获取 AccessKey:
    • AccessKey ID
    • AccessKey Secret
  2. 出于安全考虑,建议:
    • 使用 RAM 用户创建 AccessKey
    • 只授予必要的 OSS 权限
    • 定期轮换 AccessKey

创建RAM用户并授予对应的权限

  1. 进入用户管理控制台
  2. 创建用户,输入对应的名称就可以了(需要验证)在这里插入图片描述
  3. 点击创建的用户,创建AccessKey(记住创建的AccessKey ID和AccessKey Secret)
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

1.4 项目配置

  • OSS地域和访问域名
  • 配置系统变量ALIBABA_AIR_TEST1_ACCESSKEY_IDALIBABA_AIR_TEST1_ACCESSKEY_SECRET(对应的值就设置成上面的AccessKey ID和AccessKey Secret)

application.yml 中配置 OSS 参数:

aliyun:
  oss:
    endpoint: oss-cn-hangzhou.aliyuncs.com
    accessKeyId: ${ALIBABA_AIR_TEST1_ACCESSKEY_ID}
    accessKeySecret: ${ALIBABA_AIR_TEST1_ACCESSKEY_SECRET}
    bucketName: air-test1
    urlPrefix: https://air-test1.oss-cn-hangzhou.aliyuncs.com/

环境变量配置:

export ALIBABA_AIR_TEST1_ACCESSKEY_ID=your_access_key_id
export ALIBABA_AIR_TEST1_ACCESSKEY_SECRET=your_access_key_secret

2. 代码实现

xml依赖

		<!-- 阿里云OSS -->
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-sdk-oss</artifactId>
			<version>3.15.1</version>
		</dependency>

2.1 OSS 配置类

@Configuration
public class OSSConfig {
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;
    
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    @Bean
    public OSS ossClient() {
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

2.2 OSS 工具类

@Component
public class AliOSSUtils {
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;
    
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    /**
     * 上传文件到OSS
     * @param file 要上传的文件
     * @param directory 存储的目录(可选,如:avatars/)
     * @return 文件访问URL
     */
    public String uploadFile(MultipartFile file, String directory) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 生成唯一文件名
        String originalFilename = file.getOriginalFilename();
        String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
        String fileName = (directory != null ? directory : "") + UUID.randomUUID().toString() + extension;

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            // 上传文件到OSS
            ossClient.putObject(bucketName, fileName, inputStream);
            
            // 构建文件访问路径
            return "https://" + bucketName + "." + endpoint + "/" + fileName;
        } finally {
            // 关闭OSSClient
            if (ossClient != null) {
                ossClient.shutdown();
            }
            // 关闭输入流
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }

    /**
     * 上传图片到OSS(简化方法,不指定目录)
     */
    public String uploadImage(MultipartFile file) throws IOException {
        return uploadFile(file, "images/");
    }

    /**
     * 上传头像到OSS
     */
    public String uploadAvatar(MultipartFile file) throws IOException {
        return uploadFile(file, "avatars/");
    }
} 

3. 使用说明

3.1 代码使用示例

上传头像:

@Autowired
private AliOSSUtils aliOSSUtils;

public String uploadAvatar(MultipartFile file) {
    try {
        return aliOSSUtils.uploadAvatar(file);
    } catch (IOException e) {
        throw new RuntimeException("上传头像失败", e);
    }
}

4. 安全建议

  1. 访问控制

    • 建议使用 RAM 用户管理 OSS 访问权限
    • 定期轮换 AccessKey
    • 使用临时访问凭证(STS)进行移动端上传
  2. 数据安全

    • 开启服务端加密
    • 配置防盗链
    • 配置 CORS(跨域)规则
  3. 文件管理

    • 使用规范的目录结构
    • 定期清理无用文件
    • 设置文件生命周期规则

5. 常见问题

5.1 上传失败

  1. 检查配置

    • endpoint 是否正确
    • AccessKey 是否有效
    • Bucket 名称是否正确
  2. 常见错误码

    • InvalidAccessKeyId:AccessKey 无效
    • SignatureDoesNotMatch:签名错误
    • NoSuchBucket:Bucket 不存在
    • AccessDenied:没有访问权限

5.2 访问权限问题

  1. Bucket 级别权限

    • 私有:需要签名URL访问
    • 公共读:可直接访问
    • 公共读写:不建议使用
  2. 文件级别权限

    • 可以覆盖 Bucket 级别权限
    • 建议使用 Bucket 权限,避免文件级别权限设置

5.3 性能优化

  1. 客户端优化

    • 使用断点续传
    • 开启压缩
    • 图片处理服务
  2. 服务端优化

    • 使用临时凭证
    • 资源复用
    • 异步处理

6. 监控和维护

  1. 监控指标

    • 存储用量
    • 请求次数
    • 流量统计
    • 返回码分布
  2. 成本控制

    • 设置用量警告
    • 配置生命周期规则
    • 选择合适的存储类型
  3. 日常维护

    • 检查访问日志
    • 更新 AccessKey
    • 清理过期文件
    • 优化存储结构

7. 参考文档

结尾

路漫漫其修远兮

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐