阿里云OSS存储

阿里云OSS存储服务

        小编最近学习中遇到公司业务需要将附件存放在阿里云OSS存储服务器中,接下来就给大家简单介绍讲解一下OSS存储的介绍,用法和JAVA SpringBoot 项目的使用和代码实现。

        有不足的地方欢迎大家评论区留言,一起进步。

引言

1.什么是阿里云OSS存储

        阿里云对象存储 OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供最高可达 99.995 % 的服务可用性。多种存储类型供选择,全面优化存储成本。

优点:

        安全性:阿里云OSS支持多种加密算法,能将用户数据进行加密存储,确保数据的保密性。同时,它还支持身份认证和权限控制功能,可以精确地控制用户对数据的访问权限。

        可靠性:阿里云OSS基于阿里云自研的分布式系统架构,能自动将数据复制到不同的存储节点,使其具备高可靠性。即使某个存储节点发生故障,阿里云OSS也能自动切换到其他存储节点,保证数据的完整性。

        高性能:阿里云OSS的访问速度快,可以为用户提供高性能的服务。它支持全球加速,能够将数据缓存在全球各地,实现全球负载均衡,提升访问速度。

2.开通OSS存储服务功能

2-1.登录阿里云平台,完成实名认证。

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

2-2.开通OSS存储服务

进入阿里云首页后再左上角产品处进行搜索 oss 打开

点击管理控制台

新建一个Bucket节点

新建成功后进入你的节点,这里就是存放上传的对象信息

点击概览查看节点信息

2-3.创建子账户

点击accessKey管理

注意:

        继续使用AccessKey:选择这里使用的是你的当前登录的总账号,如有泄露则其他服务也会一起受影响(不推荐使用)

        开始使用子账户:创建一个新的子账户,进行授权值针对于OSS存储服务

 

 点击创建账户,进入创建账户界面

 点击确定后会进行账户验证

注意:AccessKey ID,AccessKey Secret 务必妥善保管(只有在创建账户时候回显示,后面无法进行查看,自己找地方记住放好)

        AccessKey ID:相当于你的子账户用户名

        AccessKey Secret:相当于你的子账户密码

此时你的子账户已经创建成功。

2-4.给子账户添加OSS权限

 点击确定,完成后在此查看此时账户已经存在OSS存储服务权限

 阿里云OSS对象存储配置已经结束了,接下来就是大家期待的代码实现

代码实现

1.找到官方文档,参考官方文档进行开发

2.使用idea或者别的软件创建一个java项目

我这边使用的是idea 创建springboot项目,根据个人喜好

2-1导入依赖

 如果你的 jdk版本是9及以上的选择下面的

我这边使用的是 jdk1.8 版本 springboot 为 2.3.7.RELEASE

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--阿里云OSS云存储服务-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>
    </dependencies>
2-2.创建工具类

下面的信息最好是放在 resources下的yml文件中,运行项目读取使用

@Slf4j
@Component
public class OSSUtils {

    //云存储oss的阿里云账户 AccessKey
    private static final String access_key = "你自己保存的AccessKey";
    //云存储oss的阿里云账户 AccessKeySecret
    private static final String access_key_secret = "你自己保存的AccessKeySecret";
    //地域节点
    private static final String endpoint = "上面外网访问的地域节点";
    //oss存储节点名称
    private static final String bucket_name = "你自己的存储节点名称";

}

开始参考官方文档进行简单上传

赋值官方文档的上传或者使用下面我个人更改过得亦可

2-2-1.上传
@Slf4j
@Component
public class OSSUtils {
    /*
     * @阿里云 OSS存储 : 上传附件
     * */
    public Map<String, String> up_file(MultipartFile file) {

        Map<String, String> map = new HashMap<>();

        //获取原附件名
        String filename = file.getOriginalFilename();
        //截取原附件后缀
        String suffex = filename.substring(filename.lastIndexOf("."));

        // 设置上传到OSS文件的分包路径,可置空此项。置空后,文件将上传至Bucket的根目录下。
        String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String dir = format + "/";

        //防止上传附件覆盖 - 使用uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String url_file_name = dir + uuid + suffex;

        /*
         * host(杭州)为例,其它Region请按实际情况填写。
         * 填写Host名称,格式为  https://sling-guli-mall.oss-cn-nanjing.aliyuncs.com/gd.jpg
         * */
        String host = "https://" + bucket_name + "." + endpoint;//可有可无
        // 创建OSSClient实例。
        OSS oss_client = new OSSClientBuilder().build(endpoint, access_key, access_key_secret);
        // 获取上传文件的输入流
        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();
        } catch (IOException e) {
            throw new CustomException("oss存储附件输入流异常:" + e);
        }
        //调用OSS方法实现上传
        oss_client.putObject(bucket_name, url_file_name, inputStream);
        // 关闭OSSClient
        oss_client.shutdown();

        //把上传之后文件路径返回
        //需要把上传到阿里云oss路径手动拼接出来,返回前端或者保存数据库以便后续访问
        String url = "https://" + bucket_name + "." + endpoint + "/" + url_file_name;
        map.put("uuid_name", uuid + suffex);
        map.put("url_name", url_file_name);
        map.put("url", url);
        return map;
    }
}
2-2-2.删除
@Slf4j
@Component
public class OSSUtils {
    /*
     * @阿里云 OSS存储 : 删除附件
     * */
    public boolean del_file(String file_name) {

        // 创建OSSClient实例。
        OSS oss_client = new OSSClientBuilder().build(endpoint, access_key, access_key_secret);

        try {
            oss_client.deleteObject(bucket_name, file_name);
        } catch (Exception e) {
            log.info("阿里云 oss 存储删除附件异常 -> {}", e);
            throw new CustomException("删除附件异常!");
        } finally {
            oss_client.shutdown();
        }
        log.info("阿里云 oss 存储删除附件 ok");

        return true;
    }
}

 2-2-3.下载

注意:下载附件时要确保你本地保存附件路径存在,不存在则手动创建或代码创建文件夹,我这里采用的是代码自动判断创建

@Slf4j
@Component
public class OSSUtils {

    /*
     * @阿里云 OSS存储 : 下载附件
     * 注意: 下载附件时先判断附件保存路径的文件夹是否存在,不存在则先去创建保存路径文件夹
     * */
    public boolean download_file(String file_name, String url) {

        // 创建OSSClient实例。
        OSS oss_client = new OSSClientBuilder().build(endpoint, access_key, access_key_secret);

        // 转换路径中的  \  -> /
        url= url.replace("\\","/");
        //判断路径末尾是否存在 / 不存在则添加一个
        if (url.length() - 1 != url.lastIndexOf("/")) {
            url = url + "/";
        }

        //截取附件名称前面的路径地址
        String substring = file_name.substring(0, file_name.indexOf("/"));
        //文件夹不存在则创建文件夹
        String ins_url = url + substring + "/";
        File file = new File(ins_url);
        if (!file.exists()){
            try {
                file.mkdir();
            }catch (Exception e){
                e.fillInStackTrace();
            }
        }

        //下载附件的 完整路径
        String over_url = url + file_name;
        try {
            
            //附件下载
            oss_client.getObject(new GetObjectRequest(bucket_name, file_name), new File(over_url));
        } catch (Exception e) {
            log.info("阿里云 oss 存储下载附件异常 -> {}", e);
            throw new CustomException("下载附件异常!");
        } finally {
            oss_client.shutdown();
        }
        log.info("阿里云 oss 存储下载附件 ok");
        return true;
    }
}

3.编写实现接口以及实现服务类

3-1.controller
@RestController
@RequestMapping("/utils")
public class UtilsController {

    @Resource
    private UtilsService utilsService;

    @ApiOperation("阿里云oss上传附件")
    @PostMapping("/aliyu_oss_up_file")
    public DateCode aliyu_oss_up_file(@RequestParam("file") MultipartFile multipartFile){
        return utilsService.aliyu_oss_up_file(multipartFile);
    }
    @ApiOperation("阿里云oss删除附件")
    @GetMapping("/aliyu_oss_del_file")
    public DateCode aliyu_oss_del_file(String fileName){
        return utilsService.aliyu_oss_del_file(fileName);
    }

    @ApiOperation("阿里云oss下载附件")
    @PostMapping("/aliyu_oss_del_file")
    public DateCode aliyu_oss_down_file(@RequestParam("fileName") String fileName,@RequestParam("url") String url){
        return utilsService.aliyu_oss_download_file(fileName,url);
    }

}
3-2.service
public interface UtilsService {

    DateCode aliyu_oss_up_file(MultipartFile multipartFile);

    DateCode aliyu_oss_del_file(String fileName);

    DateCode aliyu_oss_download_file(String fileName, String url);

}

3-3.service-impl

        参数校验,返回值校验等校验规则我这边就不展示了(显得臃肿),根据自己的业务去做判断即可。

@Slf4j
@Service
public class UtilsServiceImpl implements UtilsService {

    //使用注解注入依赖
    @Resource
    private OSSUtils ossUtils;

    @Override
    public DateCode aliyu_oss_up_file(MultipartFile multipartFile) {
        Map<String, String> map = ossUtils.up_file(multipartFile);
        map.put("size",multipartFile.getSize());
        return DateCode.success("OSS存储上传附件成功", map);
    }

    @Override
    public DateCode aliyu_oss_del_file(String fileName) {
        boolean b = ossUtils.del_file(fileName);
        if (!b) {
            return DateCode.error("OSS存储删除附件失败");
        }
        return DateCode.success("OSS存储删除附件成功");
    }

    @Override
    public DateCode aliyu_oss_download_file(String fileName, String url) {
        boolean b = ossUtils.download_file(fileName, url);
        if (!b) {
            return DateCode.error("OSS存储下载附件失败");
        }
        return DateCode.success("OSS存储下载附件成功");
    }

}

测试

可使用 Swagger 在浏览器自行测试
我这边使用的测试软件是Postmain

1.启动项目打开测试工具

2.填写测试信息

3.选择附件发起调用接口

4.复制地址去浏览器访问即可

 接下来的删除,下载接口自行测试,这边就不给大家一一测试了

 其他

想要学习更多技能可参考阿里云官方文档进行学习,欢迎大家留言,指出不足。

  • 31
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值