SpringBoot整合阿里云OSS对象存储

前言

为了解决海量数据存储与弹性扩容,我们一般采用云存储的解决方案-阿里云OSS。


一、阿里云OSS是什么?

可直接搜索阿里云官网,申请阿里云账号并进行实名认证
在这里插入图片描述
搜索对象存储OSS,并开通服务在这里插入图片描述
点击进入后立即开通并管理控制台(我这里已经开通)
在这里插入图片描述
来到这个页面后,我们点击【创建Bucket】
Bucket 的中文意思是桶,桶是用来干嘛的?当然是装东西的。也就是官方说的存储空间。
你可以理解为你电脑中的C盘、D盘、E盘等。
在这里插入图片描述
可根据具体需求来选择相应业务项
在这里插入图片描述
Bucket创建完成后,记住Endpoint。阿里云的OSS只是一个服务,我们要使用服务,需要 AccessId 和 AccessKey 进行授权。不光是阿里接口,几乎所有API接口都有这一步。右上角查看AccessKey 和AccessKey Secret。
在这里插入图片描述
第一次创建,会弹出这个东西。一般来说,个人的数据没有那么必要折腾,选择【继续使用AccessKey】。而如果是公司用的话,基于安全原因,一般选择【开始使用字用户AccessKey】
在这里插入图片描述

二、测试Bucket

引入相关依赖

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

测试创建Bucket的连接。其中:

  1. endpoint :创建Bucket后概览页面获取
  2. accessKeyId :可由右上角个人信息中AccessKey管理获取
  3. accessKeySecret :可由右上角个人信息中AccessKey管理获取
  4. bucketName :创建Bucket时的名称
public class TestOSS {

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

    @Test
    public void testCreateBucket() {
        // 创建OSSClient实例
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 创建存储空间
        ossClient.createBucket(bucketName);
        // 关闭ossClient
        ossClient.shutdown();
    }

}

显示如下所示,则Bucket可连接
在这里插入图片描述
判断存储空间是否存在

@Test
    public void testExist() {
        // 创建OSSClient实例
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

        boolean exist = ossClient.doesBucketExist(bucketName);
        System.out.println(exist);

        // 关闭ossClient
        ossClient.shutdown();

    }

在这里插入图片描述

三、文件上传

配置application.properties

#服务端口
server.port=8080

# 应用名称
spring.application.name=OssDemo01

#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=your Endpoint
aliyun.oss.file.keyid=your AccessKeyID
aliyun.oss.file.keysecret=your AccessKeySecret
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=your BucketName

从配置文件读取常量
创建常量读取工具类:ConstantPropertiesUtil.java
使用@Value读取application.properties里的配置内容
用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。

/**
 * 常量类,读取配置文件application.properties中的配置
 */
@Component
//@PropertySource("classpath:application.properties")
public class ConstantPropertiesUtil implements InitializingBean {

	@Value("${aliyun.oss.file.endpoint}")
	private String endpoint;

	@Value("${aliyun.oss.file.keyid}")
	private String keyId;

	@Value("${aliyun.oss.file.keysecret}")
	private String keySecret;

	@Value("${aliyun.oss.file.filehost}")
	private String fileHost;

	@Value("${aliyun.oss.file.bucketname}")
	private String bucketName;

	public static String END_POINT;
	public static String ACCESS_KEY_ID;
	public static String ACCESS_KEY_SECRET;
	public static String BUCKET_NAME;
	public static String FILE_HOST ;

	@Override
	public void afterPropertiesSet() throws Exception {
		END_POINT = endpoint;
		ACCESS_KEY_ID = keyId;
		ACCESS_KEY_SECRET = keySecret;
		BUCKET_NAME = bucketName;
		FILE_HOST = fileHost;
	}
}

创建service接口

public interface IFileService {

	/**
	 * 文件上传至阿里云
	 * @param file
	 * @return
	 */
	String upload(MultipartFile file);
}

实现接口

@Service
public class FileService Impl implements IFileService {

    @Override
    public String upload(MultipartFile file) {
        //工具类获取值
        String endpoint = ConstantPropertiesUtil.END_POIND;
        String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;

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

            // 上传文件流
            InputStream inputStream = file.getInputStream();

            //获取文件名称
            String fileName = file.getOriginalFilename();

            //存在问题:多次上传相同文件的名称,造成最后一次上传把之前上传文件覆盖
            //解决:方式1.在文件名称里面添加随机唯一的值
            String uuid = UUID.randomUUID().toString().replace("-", "");
            fileName = uuid + fileName;
            //方式2  把文件按照日期进行分类
            String datePath = new DateTime().toString("yyyy/MM/dd");
            fileName = datePath +"/" + fileName;

            //调用oss方法实现上传
            //第一个参数:Bucket名称
            //第二个参数:上传到oss文件路径和文件名称
            //第三个参数:上传文件输入流
            ossClient.putObject(bucketName,fileName,inputStream);

            // 关闭OSSClient。
            ossClient.shutdown();

            //把上传之后的文件路径返回
            String url = "https://" + bucketName + "."+endpoint + "/" + fileName;
            return url;
        }catch (Exception e){

            e.printStackTrace();
            return null;

        }
    }
}

控制层

@RestController
@RequestMapping("/file/upload")
@AllArgsConstructor
public class FileController {

    private final IFileService fileService;

    @PostMapping
    public String upload(MultipartFile file){
        //获取上传文件 MultipartFile
        //返回上传到oss的路径
        String url = fileService.upload(file);
        return url;
    }

}

添加swagger依赖,测试文件上传功能

<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger2</artifactId>
    <version>2.7.0</version>
</dependency>
<dependency>
	<groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.7.0</version>
</dependency>

通过swagger进行验证
在这里插入图片描述
返回控制台,可查看到上传的文件
在这里插入图片描述
通过详情中的Url可正常访问到
在这里插入图片描述
至此,springboot整合阿里云OSS完成啦!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值