阿里云对象存储OSS的申请和使用

607 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

作者平台:

| CSDN:blog.csdn.net/qq_41153943…

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

| 微信公众号:1024笔记

本文一共2339字,预计阅读10分钟

前言

在公司的一些业务场景中,关于视频、图片等一些数据的存储并非是存在本地的文件服务器中,使用的是阿里云的对象存储OSS。今天就一起简单的学习阿里云的对象存储服务。

什么是阿里云对象存储服务

OSS全称是Object Storage Service,即对象存储服务。为了解决海量数据存储与弹性扩容,在很多的项目和业务场景中,很多公司都会采用云存储的解决方案。阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,能够提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。

如何开通OSS

开通阿里云的OSS需要以下步骤:

首先需要的肯定是要有阿里云的账号,如果没有得先申请一个并且完成实名认证,然后根据以下步骤开通“对象存储OSS”服务:

开通之后进入管理控制台界面:

注:这里建议先充值一块钱,用于一些微量扣费,如果只是作为学习使用,实际产生得费用很低,所以一块钱能够足够使用了。

创建Bucket

Bucket中文名即水桶、桶。这里可以看成windows的系统盘,我们创建一个bucket就类似于创建了一个c盘、d盘等等。创建Bucket的过程如下:

需要输入创建的bucket的名称,根据自己的实际需要填写,地域也根据自己的区域选择,其他的基本都可以使用默认选择,比如存储类型:标准存储/低频存储;同城冗余存储:进行备份,开通收费;版本控制:不开通;读写权限:公共读;实时日志查询:不开通。

获取AccessKey

如果需要在项目中使用OSS,那么还有需要使用的是AccessKey:

然后需要通过账号绑定的手机号验证,然后查看Secret。

实际开发

接下来就演示如何在项目中使用阿里云的OSS。具体可以参考阿里云oss的官方文档:

help.aliyun.com/document\_d…

首先需要在项目中导入阿里云oss的相关依赖:

 <!--aliyunOSS-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
    </dependency>
      <!-- 日期工具栏依赖 -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
    </dependency>

然后配置配置application.properties,主要需要配置的参数是endpoint(节点即刚刚创建的bucket的地域)、bucketName(刚刚创建的bucket的名字)、accessKeyId和accessKeySecret就是刚刚查看Secret的密钥的内容,具体根据自己的实际进行配置:

#服务端口
server.port=8002
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 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 bucket

接下来需要做的就是实现文件上传至阿里云OSS。

创建一个工具类,从配置文件读取oss配置常量。这里使用@Value读取配置文件中的内容。

用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用,具体代码如下:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

//当项目已启动,spring接口,spring加载之后,执行接口一个方法implements InitializingBean
@Component
public class ConstantPropertiesUtil implements InitializingBean {
    //@Value读取配置文件内容,自动注入
    @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.bucketname}")
    private String bucketName;
    //定义公开静态常量
    public static String END_POIND;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;
    @Override
    public void afterPropertiesSet() throws Exception {
        END_POIND = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }
}

然后创建一个service接口用于文件上传:

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

创建一个该接口的实现类,实现具体的文件上传核心逻辑,具体可以参考sdk官方文档:

public class FileServiceImpl implements FileService {
    @Override
    public String upload(MultipartFile file) {
        //获取阿里云存储相关常量
        String endPoint = ConstantPropertiesUtil.END_POINT;
        String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        String fileHost = ConstantPropertiesUtil.FILE_HOST;
        String uploadUrl = null;
        try {
            //判断oss实例是否存在:如果不存在则创建,如果存在则获取
            OSSClient ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
            if (!ossClient.doesBucketExist(bucketName)) {
                //创建bucket
                ossClient.createBucket(bucketName);
                //设置oss实例的访问权限:公共读
                ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            }
            //获取上传文件流
            InputStream inputStream = file.getInputStream();
            //构建日期路径:picture/2022/06/19/文件名
            String filePath = new DateTime().toString("yyyy/MM/dd");
            //文件名:uuid.扩展名
            String original = file.getOriginalFilename();
            //随机uuid
            String fileName = UUID.randomUUID().toString();
            String fileType = original.substring(original.lastIndexOf("."));
            String newName = fileName + fileType;
            String fileUrl = fileHost + "/" + filePath + "/" + newName;
            //文件上传至阿里云
            ossClient.putObject(bucketName, fileUrl, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            //获取url地址
            uploadUrl = "http://" + bucketName + "." + endPoint + "/" + fileUrl;
        } catch (IOException e) {
            throw new JiangxiaException(ResultCodeEnum.FILE_UPLOAD_ERROR);
        }
        return uploadUrl;
    }
}

controller代码实现如下:

@Api(description="阿里云OSS学习")
@RestController
@RequestMapping("/jiangxia/oss/file")
public class FileController {
    @Autowired
    private FileService fileService;
    @ApiOperation(value = "文件上传")
    @PostMapping("upload")
    public ResultData upload(
            @ApiParam(name = "file", value = "文件", required = true)
            @RequestParam("file") MultipartFile file) {
        String uploadUrl = fileService.upload(file);
        //返回r对象
        return ResultData.ok().message("文件上传成功").data("url", uploadUrl);
    }
}

启动项目,使用postman或者SwaggerUI进行接口文件上传测试,可以正常将自己的文件上传至阿里云oss中自己使用的Bucket列表中,并且根据实际进行分组:

总结

以上就是如何申请阿里云的oss服务以及如何在项目中具体使用,其核心就是bucket的创建。每次文件上传都是上传至具体的bucket中,并且可以根据自己代码得了逻辑进行分组和命名,代码的核心就是endpoint、bucketName、accessKeyId和accessKeySecret这四个参数的使用,具体的核心代码基本可以参考sdk的帮助文档进行核心参数的替换即可。

相关推荐