1.阿里云oss基本介绍

        阿里云对象存储服务(Object Storage Service,简称 OSS)是阿里云提供的海量、安全、低成本、高可靠的云端存储服务。它非常适合用来存储和管理大量的非结构化数据,如图片、视频、日志文件、备份数据等。

ps:简单来说就是把本地的资源(图片,视频,备份数据等)上传到阿里云Oss中进行保存/托管,在SpringBoot项目中把Oss作为文件的保存端,在项目使用到文件的时候可以更加快速的与后端建立联系。

2.阿里云oss开通

2.1.创建bucket

        确保创建的Bucket的访问权限是 公共读

2.2.设置访问权限为公共读

2.3测试创建的Bucket是否可用

2.4.生成/获取密钥(AccessKey)

2.5.删除Bucket

3.阿里云Oss在SpringBoot项目中的应用

ps:在阿里云Oss中提供了其在Java后端使用方法的参考文档,如下:

后续是我根据参考文档整理的用法

3.1.添加Maven依赖项

meaven的作用:

        作用:引入阿里云 OSS 的 SDK,这是与 OSS 进行交互的基础库。

        其他依赖项(如 jaxb-api 等): 这些依赖是为了解决某些版本的 Java 中缺少 JAXB API 的问题,确保项目可以在没有内置 JAXB 支持的环境中正常运行。

个人见解:Meaven提供了阿里云Oss与后端进行交互的基础库(建立了连接)

java 8版本

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

java 9及以上版本------则需要添加以下JAXB相关依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

3.2.配置 配置文件application.yml

配置文件的作用:

  • 作用:提供了应用程序所需的 OSS 配置项。application.yml 中设置了占位符,而具体的值则放在了 application-dev.yml 中,这允许根据不同的环境(例如开发、测试、生产)有不同的配置。确保应用程序能够正确地访问 OSS,同时支持多环境部署。

个人见解:提供了访问阿里云Oss的配置项(提供了与阿里云建立连接的钥匙)

只有application.yml文件

sky:
    alioss:
    # 配置阿里云oss实际的操作连接数据
    endpoint: oss-cn-beijing.aliyuncs.com
    access-key-id: ***************
    access-key-secret: *****************
    bucket-name: sky-take-out-0307


endpoint:域名----创建Bucket时选择的域名
access-key-id: AccessKey ID 
access-key-secret: AccessKey Sectect
 bucket-name: Bucket名称

有application-dev.yml和application.yml文件

application.yml:
    
    sky:
        alioss:
        # 设置阿里云oss文件上传配置,实际配置书写在dev.yml中
        endpoint: ${sky.alioss.endpoint}
        access-key-id: ${sky.alioss.access-key-id}
        access-key-secret: ${sky.alioss.access-key-secret}
        bucket-name: ${sky.alioss.bucket-name}

application-dev.yml:

    sky:
        alioss:
        # 配置阿里云oss实际的操作连接数据
        endpoint: oss-cn-beijing.aliyuncs.com
        access-key-id: LTAI5tGnD3VkvEmVU99NSyHR
        access-key-secret: PfUknY0YQggCOfjj0rwB2rVy3mCnVi
        bucket-name: sky-take-out-0307
    

3.3.配置属性类

配置属性类的作用:

  • 作用:这个类用于从 application.yml 或其他配置文件中读取与 OSS 相关的配置信息,并将其绑定到 Java 对象上。它是连接应用程序和配置文件的桥梁,使得可以在运行时动态获取或更新 OSS 的配置信息。

配置属性类的位置:一般配置属性类会有专门的包来存放即 properties 包

/*
* 读取OSS配置----配置属性类
* */
@Component
@ConfigurationProperties(prefix = "sky.alioss")
//将配置文件声明成类文件,@ConfigurationProperties(prefix = "sky.alioss")表明了是配置问件下的具体的那个配置,也就是说注解@ConfigurationProperties(prefix = "sky.alioss")可以把配置文件中的值对应到这个类中的属性上
@Data
public class AliOssProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

}

3.4.书写工具类utils

工具类的作用:

  • 作用:提供了一系列方法来操作 OSS,如上传文件等。通过构造函数注入了必要的配置参数。这是实际执行文件上传的核心逻辑所在,所有的文件上传请求都会调用这个类的方法。

工具类的位置:存放在工具类包下 即utils包


/**
 * 阿里云文件上传工具类
 */
@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());

        return stringBuilder.toString();
    }
}

3.5.编写配置类

配置类作用:

  • 作用:负责创建并注册 AliOssUtil Bean 到 Spring 容器中,以便在整个应用中使用。确保每次需要使用 AliOssUtil 时都能获得一个已经初始化好的实例,而不需要手动实例化。

位置:存放在config包下

/**
 * 配置类,用于创建AliOssUtil对象
 */
@Configuration
@Slf4j
public class OssConfiguration {

    @Bean
    @ConditionalOnMissingBean
//@ConditionalOnMissingBean注解的意思:当没有这个对象的时候再去创建。注意要return的是这个新创建的对象,不然后面自动注入会失败,这里的主要目的就是创建Bean对象。
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
        log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());
    }
}

3.6.编写通用上传接口commonController


/**
 * 通用接口
 */
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {

    @Autowired//在配置类中已经把工具类封装成了对象(Bean),所以这里可以直接使用依赖注入
    private AliOssUtil aliOssUtil;

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file){
        log.info("文件上传:{}",file);

        try {
            //原始文件名
            String originalFilename = file.getOriginalFilename();
            //截取原始文件名的后缀   dfdfdf.png
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            //构造新文件名称
            String objectName = UUID.randomUUID().toString() + extension;

            //文件的请求路径
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            return Result.success(filePath);
        } catch (IOException e) {
            log.error("文件上传失败:{}", e);
        }

        return Result.error(MessageConstant.UPLOAD_FAILED);
    }
}

Logo

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

更多推荐