一.阿里云OSS简介

阿里云对象存储服务,简称 OSS,是一种面向海量数据规模的分布式存储服务,具有稳定、可靠、安全、低成本的特点,能够提供十一个九的数据可靠性。OSS提供与平台无关的RESTful API接口,您可以在互联网任何位置存储和访问。OSS的容量和处理能力弹性扩展,并提供多种存储类型供您选择,全面优化存储成本。

二.注册

打开阿里云网站https://www.aliyun.com/,点击产品,再上云必备中找到对象存储,

ios 上传oss oss上传文件_spring

点击 立即开通

 

ios 上传oss oss上传文件_上传_02

 

ios 上传oss oss上传文件_ios 上传oss_03

 

 

ios 上传oss oss上传文件_上传_04

 三.文件上传

1.通过oss控制台上传

ios 上传oss oss上传文件_ios 上传oss_05

首先建一个Bucket->右面点击创建Bucket,根据下面你的所需进行更改
标准存储:文件频繁访问到用它
归档存储:基本不访问,只做存储
同城冗余存储,备份作用但收费

这里我只是做简单的项目,低频访问存储就可以了,需要访问不能用归档存储

 

ios 上传oss oss上传文件_spring_06

ios 上传oss oss上传文件_上传_07

完成后创建即可

oss控制台

ios 上传oss oss上传文件_ios 上传oss_08

点击左侧你刚创建的bucket,可以在里面通过控制台进行手动上传文件

ios 上传oss oss上传文件_ios 上传oss_09

 

ios 上传oss oss上传文件_上传_10

ios 上传oss oss上传文件_上传_11

2.通过Java代码进行上传

在实际开发的时候开发人员一般没有权限来到后台控制台,进行上传,所以大部分是通过代码来上传,建立了普通用户和oss存储的桥梁。

(1),准备工作

在bucket控制台中会有Access Key点击进入

ios 上传oss oss上传文件_ios 上传oss_12

 创建ID和SecssKey

ios 上传oss oss上传文件_上传_13

再找到开发oss的开发文档

ios 上传oss oss上传文件_上传_14

ios 上传oss oss上传文件_spring_15

ios 上传oss oss上传文件_ios 上传oss_16

ios 上传oss oss上传文件_ios 上传oss_17

找到这个文档利用里面现有的代码来进行,快速开发!我们要做的是文件文件上传的功能,所以下面我们写逻辑代码

(2).后端逻辑代码

1.创建以下服务结构

ios 上传oss oss上传文件_ios 上传oss_18

2.引入相关依赖

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

3.配置文件中配置相应环境

下面aliyun.oss.file.的值是刚刚生成的ID,key,你的oss地址,和bucket名字

#基本固定模式
#服务端口
server.port=8002
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev

#阿里云 OSS
#不同的服务器,地址不同   ==前面后面都不能加空格!!!!!!!!!!!!!!!!!1
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=LTAI5tKSbrjRuatoVSMNs9Fk
aliyun.oss.file.keysecret=yHTcqZgnWTFxoRGkIxcOxefZ1Zmc1H
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=edu-zt-001

4.创建启动类

加上@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)原因是:

当springboot启动的时候会自动配置数据源,但是配置文件中没有配置数据源就会以下错误


Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. *exclude = DataSourceAutoConfiguration.class


加上后就是再启动的时候,将数据源的自启动移除。就不会报错了!!

 

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(basePackages = {"com.zt"})
public class OssApplication {
    public static void main(String[] args) {
        SpringApplication.run(OssApplication.class,args);
    }
}

5.创建常量类,读取配置文件中的内容

配置文件中的aliyun.oss.file后面的字段需要用到,所以创建工具类方便拿取。

* 因为是private类型的不能直接去用,
 * 当项目一启动,就会交给spring管理,下面就会取到值,spring有接口
 *
 *
 */
@Component//交给spring管理
public class ConstantPropertiesUtils 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.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;
    //当上面值初始化的后 接口会执行
    //通过这个公共的方法就可以再别的类中引用这些私有的变凉了
    @Override
    public void afterPropertiesSet() throws Exception {
        END_POINT=endpoint;
        ACCESS_KEY_ID = keyid;
        ACCESS_KEY_SECRET = keysecret;
        BUCKET_NAME = bucketname;
    }
}

6.在controller中创建service

作用是拿到文件的在oss上的路径,方便写入到数据库中,图片的格式是不能写到数据库中,数据库中记录的是图片在oss中的地址。

@CrossOrigin
@RestController
@RequestMapping("/eduoss/file")
public class OssController {

    @Autowired
    private OssService ossservice;
    //上传头像的方法
    @PostMapping
    public UnResult uploadOssFile(MultipartFile file){
        //获取上传文件
        //返回上传到oss的路径
        String url = ossservice.uploadFileAvatar(file);
        return UnResult.ok().data("url",url);
    }
}

7.在service实现上传文件到oss中

其中的代码是前面找到官方文档中的代码,

里面应注意的是:

当有多个文件重名的时候,oss中会默认存储最后一个,前面都覆盖掉了,解决的方法有两个

代码中注释写的很清楚了!!

1.用UUID生成唯一值,拼接到文件名中

2.根据日期来创建文件夹

 

ios 上传oss oss上传文件_spring_19

//Service中
public interface OssService {
    //上传头像到oss
     String uploadFileAvatar(MultipartFile file);
}

//serviceimpl中
@Service
public class OssServiceImpl implements OssService {

    @Override
    public String uploadFileAvatar(MultipartFile file) {
        //用工具类获取
        String endpoint = ConstantPropertiesUtils.END_POINT;
        String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;

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

            //获取文件上传输入流
            InputStream inputStream = file.getInputStream();
            //获取文件名称
            
            String fileName = file.getOriginalFilename();
            ///当文件名重复的时候,再oss中会覆盖掉原有的文件

            //解决1:用uuid---------------replace是为了将随机生成的数字的“-”去掉
            String uuid= UUID.randomUUID().toString().replace("-","");
//            //拼接
//             fileName=uuid+fileName;

             //解决2:把文件按日期分类
            //2021//11/12/01.jpg
            //获取当前日期,用依赖中的工具类
            String datePath = new DateTime().toString("yyyy/MM/dd");
            //拼接
            fileName=datePath+fileName;

            //调用oss方法实现上传
            //参数1:Bucket名称
            //参数2:上传到oss的文件路径和文件名
            //参数3:上传文件输入流
            ossClient.putObject(bucketName, fileName, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();

            //把上传之后的文件路径返回
            //需要把上传到阿里云oss路径手动拼接出来
            //根据路径名‘
            String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

8.测试 

因为之前这个系统集成了swagger,所以用它来进行测试

命名方式为时间文件夹及UUID

ios 上传oss oss上传文件_ios 上传oss_20

ios 上传oss oss上传文件_文件名_21

ios 上传oss oss上传文件_上传_22