美文网首页
小白使用阿里云的oss实现文件云存储

小白使用阿里云的oss实现文件云存储

作者: 名字是乱打的 | 来源:发表于2020-02-03 02:13 被阅读0次

    超级简单的阿里云oss使用,把我代码复制即可使用

    一.需求

    项目需要上传头像,不想存在本地,之前用过阿里云其他产品,这里就使用一下阿里云的oss了,不得不说阿里云的产品使用步骤真的很清晰.这里说一下我自己的使用步骤.

    步骤:

    1.没有阿里云账号的先去注册和认证

    选择对象存储oss,进行开通



    开通不要钱,有一定免费额度


    2.创建bucket,类似于文件夹

    权限可以设置为公共读


    3.可视化使用

    大家可以自己去文件管理里上传一个图片试试就知道了,每个存储文件会生成一个对应的url,拿到之后我们可以从阿里云上下载下来这个图片.

    4.开发使用

    阿里云很多小白指南非常适合我这样的菜鸡,这里有一个oss开发者使用指南,大家可以点击oss学习路径的java sdk看看,所谓sdk类似于一个说明书

    5.参考一下阿里云 oss java sdk

    其实也就是两步
    1.引pom

    <!--阿里云oss-->
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>3.8.0</version>
            </dependency>
            <!--阿里云oss-->
    

    2.复制黏贴大法

    步步高点读机哪里不会点哪里,每一个操作阿里云都提供了对应的api

    这里写一下我使用阿里云oss的图片上传,大家可作demo参考

    由于阿里云一些密钥配置和地域结点,bucket等是常量级的,所以我这里抽取出来放在了application.properties中,方便管理 ,数据我手动加密了....大家换成自己的即可,
    这些配置key=value key都是自己随便写的(也不是,起码可以见名思意),只是为了我们配置的一个配置类可以利用spring的依赖注入填充value而已

    #配置阿里云oss的固定值
    #阿里云 OSS
    #不同的服务器,地址不同
    aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
    aliyun.oss.file.keyid=XXXXXXXXXX
    aliyun.oss.file.keysecret=XXXXXXXXXXXX
    #bucket可以在控制台创建,也可以使用java代码创建
    aliyun.oss.file.bucketname=zyh-XXXXXXXXX
    
    配置类

    说明:

    • 1.首先加了@Component注解使咱们的这个文件可以随着spring容器一起启动
    • 2.该util类实现了InitializingBean ,可以在配置文件加载后调用afterPropertiesSet方法进行一些操作
    • 3.我们这里先设置了一些private对象进行配置文件中值的依赖注入
    • 4.我们这里重新定义了一些大写的常量
      • 首先public使外部类(别的类)可以调用
        -static使外部类可以直接通过类名.(点)调用
    • 在afterPropertiesSet中对常量进行赋值
    package com.zyh.future.util;
    
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    //服务器启动的时候读取配置文件的内容
    @Component
    public class ConstantPropertiesUtils implements InitializingBean {
    
        //如果我们直接@value("a")是把a赋值给endpoint
        //所以我们需要使用spring提供的一个方法"${a}"来获取a对应的值
        @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;
    
        //这些值赋值好了但是我们没用办法直接使用的。
    
        //我们可以设置一些staic静态变量,这样就可以直接用类名.来调用了
        public static String ENDPOINT;
        public static String KEYID;
        public static String KEYSECRET;
        public static String BUCKETNAME;
    
        //服务器启动就会初始化ConstantYmlUtils并且调用afterPropertiesSet方法读取配置文件的内容
        @Override
        public void afterPropertiesSet() throws Exception {
            ENDPOINT=endpoint;
            KEYID=keyid;
            KEYSECRET=keysecret;
            BUCKETNAME=bucketname;
        }
    }
    
    

    Controller

    说明:
    我们阿里云oss仓库的url是一个咱们的仓库+固定的地域结点值+咱们的文件名字,所以这里为了使上传的文件名字不重复,使用了一个idworker,不知道的可以看一下Twitter的 Snowflake(雪花算法)

    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.zyh.future.entity.Result;
    import com.zyh.future.entity.StatusCode;
    import com.zyh.future.util.ConstantPropertiesUtils;
    import com.zyh.future.util.IdWorker;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.InputStream;
    
    
    /**
     * 功能描述: 上传文件到阿里云oss
     * @Param: 
     * @Return: 
     * @Author: Zyh
     * @Date: 2020/2/2 23:19
     */
    @RestController
    @CrossOrigin
    @RequestMapping(value = "/fileupload")
    public class FileUploadConteoller {
        @Autowired
        private IdWorker idWorker;
    
        /**
         * 功能描述: 上传用户头像
         * @Param: [file]
         * @Return: com.zyh.future.entity.Result 返回头像上传后在阿里云oss上的路径
         * @Author: Zyh
         * @Date: 2020/2/3 0:19
         */
        @RequestMapping(value = "/file",method = RequestMethod.POST)
        public Result fileUpload(@RequestParam("file") MultipartFile file){
            /*上传文件到阿里云oss*/
            // 地域结点Endpoint以北京为例,其它Region请按实际情况填写。
            String endpoint = ConstantPropertiesUtils.ENDPOINT;
            // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,
            String accessKeyId = ConstantPropertiesUtils.KEYID;
            String accessKeySecret = ConstantPropertiesUtils.KEYSECRET;
            String bucketName= ConstantPropertiesUtils.BUCKETNAME;
            /*上传文件到阿里云oss*/
            //1.使用@RequestParam("file") MultipartFile file可以接收到文件
            //使用MultiparatFile 接收文件需要指定一个参数名,这个值应该是我们前端指定的input文件标签名
            //2.得到上传文件的名称获取上传输入流
            String filename = file.getOriginalFilename();
            System.out.print("所要上传的文件名称为:"+filename);
    
            //创建一个唯一id作为文件名字,并覆盖之前的文件名字,之前的文件名字这里只显示到console中
            filename = idWorker.nextId()+filename.substring(filename.lastIndexOf("."));
    
            //以我手动上传的文件为例http://zyh-future.oss-cn-beijing.aliyuncs.com/IMG_6407.JPG
            //前面都是固定的域https://zyh-future.oss-cn-beijing.aliyuncs.com/
            /*自己拼出来在之后阿里云上的文件路径*/
            String path="http://"+bucketName+"."+endpoint+"/"+filename;
            try{
    
                InputStream inputStream = file.getInputStream();
                /*上传文件到阿里云oss*/
                // 创建OSSClient实例。
                OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
                // 上传文件流。//参数分别为仓库名称,文件名称,文件流
                ossClient.putObject(bucketName, filename, inputStream);
    
                // 关闭OSSClient。
                ossClient.shutdown();
                /*上传文件到阿里云oss*/
    
            }catch (Exception e)
            {
                e.printStackTrace();
            return new Result(true, StatusCode.ERROR,"上传失败");
            }
            //返回头像在阿里云oss上的路径
            return new Result(true, StatusCode.OK,"上传成功", path);
    
        }
    
    }
    
    

    大家搭建完了可以用postman测试一下

    展示一下,我的OK

    ps:如果我们想方便管理或者后期扩展,我们这里也可以引入一个工具

            <!--日期时间工具-->
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>2.10.1</version>
            </dependency>
    

    我们可以用这个工具的一个方法String dirpath=new DateTime().tostring("yyyy/MM/dd");将当前的时间转换为yyyy/MM/dd的格式,比如2020/02/03
    这样我们上传的文件名字时候可以以这个dirpath作为我们的图片所在的文件夹名称,以分布式id生成器生成的id为名称存储.

            filename = dicpath+"/"+idWorker.nextId()+filename.substring(filename.lastIndexOf("."));
         
    ossClient.putObject(bucketName, filename, inputStream);
    
    
    

    下面看一下效果


    相关文章

      网友评论

          本文标题:小白使用阿里云的oss实现文件云存储

          本文链接:https://www.haomeiwen.com/subject/wrkcxhtx.html