SpringBoot集成阿里云OSS实现图片存储服务

阿里云OSS(Object Storage Service)是一种强大的云存储服务,可用于存储和管理大量的静态文件如图片、视频、音频等。Spring Boot与阿里云OSS集成,实现图片上传存储服务,具有以下场景和意义:

  • 分布式存储:使用阿里云OSS可以将图片等静态资源存储在云端,实现分布式的存储和管理。这样可以提高数据的可用性和可靠性,减少单点故障的风险,确保应用程序在面对高并发访问时能够快速响应。

  • 弹性扩展:阿里云OSS具备强大的扩展性,能够根据业务需求自动扩展存储容量和吞吐量。当应用程序的用户量增加,需要处理更多的图片上传请求时,可以依靠阿里云OSS的弹性扩展能力,无需担心系统性能的瓶颈问题。

  • 安全性保障:阿里云OSS提供了多种安全机制,如身份验证、权限管理等,可以控制用户对存储在OSS上的图片的访问权限。通过集成Spring Security等安全框架,可以实现对上传图片的访问控制和权限管理,确保只有授权的用户才能访问和下载图片。

  • 资源代理和加速:通过OSS的CDN(Content Delivery Network)特性,可以将存储在OSS上的图片缓存到全球各地的节点上,加速图片的传输和加载速度。这样可以提升用户访问图片的体验,减少网络延迟带来的等待时间,提高应用程序的性能。

  • 成本效益:使用阿里云OSS可以将存储和处理大量图片的成本转移给云服务提供商。OSS提供了灵活的计费方式,按照存储容量和网络流量进行计费,让开发者可以根据实际需求进行成本控制,并避免过度投入到硬件设备和维护上。

本文实现流程:

image-20230620075847664

1、OSS概述

对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

地址:https://www.aliyun.com/product/oss

image-20230620082640789

2、账号申请

2.1 购买服务

如何购买开通服务。

image-20230620082945562

image-20230620082954129

购买下行流量包:(不购买也可以使用,按照流量付费)

image-20230620083008045

说明:OSS的上行流量是免费的,但是下行流量是需要购买的。

2.2 创建Bucket

使用OSS,首先需要创建Bucket,Bucket翻译成中文是水桶的意思,把存储的图片资源看做是水,想要盛水必须得有桶。进入控制台,https://oss.console.aliyun.com/overview

image-20230620083026579

选择Bucket后,即可看到对应的信息,如:url、消耗流量等 :

image-20230620083037609

文件管理:

image-20230620083046008

查看文件:

image-20230620083137039

3、抽取模板工具

阿里云OSS采用自定义工具的形式进行封装

image-20230620091736515

OssProperties配置类

@Data
@ConfigurationProperties(prefix = "tanhua.oss")
public class OssProperties {
    
    

    private String accessKey; 
    private String secret;
    private String bucketName;
    private String url; //域名
    private String endpoint;
}

OssTemplate模板对象

package com.tanhua.autoconfig.template;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.tanhua.autoconfig.properties.OssProperties;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public class OssTemplate {
    
    

    private OssProperties properties;

    public OssTemplate(OssProperties properties) {
    
    
        this.properties = properties;
    }

    public String upload(String filename, InputStream is) {
    
    
        // 拼写图片路径
        filename = new SimpleDateFormat("yyyy/MM/dd").format(new Date())
                +"/"+ UUID.randomUUID().toString() + filename.substring(filename.lastIndexOf("."));


        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = properties.getEndpoint();
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = properties.getAccessKey();
        String accessKeySecret = properties.getSecret();

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
        ossClient.putObject(properties.getBucketName(), filename, is);
        // 关闭OSSClient。
        ossClient.shutdown();

        String url = properties.getUrl() +"/" + filename;
        return url;
    }
}

AutoConfiguration配置类

@EnableConfigurationProperties({
    
    
        OssProperties.class
})
public class AutoConfiguration {
    
    

    @Bean
    public OssTemplate ossTemplate(OssProperties properties) {
    
    
        return new OssTemplate(properties);
    }
}

yml配置内容

tanhua: # 都换成自己的
  oss:
    accessKey: LTAI4GKgob9vZ53k2SZdyAC7
    secret: LHLBvXmILRoyw0niRSBuXBZewQ30la
    endpoint: oss-cn-beijing.aliyuncs.com
    bucketName: tanhua001
    url: https://tanhua001.oss-cn-beijing.aliyuncs.com/

4、测试

编写测试类OssTest

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AppServerApplication.class)
public class OssTest {
    
    

    @Autowired
    private OssTemplate template;

    @Test
    public void testTemplateUpload() throws FileNotFoundException {
    
    
        String path = "填自己的";
        FileInputStream inputStream = new FileInputStream(new File(path));
        String imageUrl = template.upload(path, inputStream);
        System.out.println(imageUrl);
    }
}

测试成功:

putStream = new FileInputStream(new File(path));
String imageUrl = template.upload(path, inputStream);
System.out.println(imageUrl);
}
}


测试成功:

![image-20230620091938050](https://img-blog.csdnimg.cn/img_convert/19d705a73cff538552695d9b0d4c5b1c.png)

猜你喜欢

转载自blog.csdn.net/qq_51808107/article/details/131299958