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

2020-02-03  本文已影响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
配置类

说明:

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);


下面看一下效果


上一篇下一篇

猜你喜欢

热点阅读