Mooc项目开发笔记(七):后端集成阿里云OSS存储头像

一、对象存储OSS开通

1、登录阿里云开通对象存储OSS

阿里云OSS

2、创建Bucket

首先进入管理控制台OSS,然后点击 Bucket 管理界面中的创建 Bucket 按钮,会出现下面的界面:

Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第1张图片

填写信息,下面列出了几个关建的选择类型,其他默认,填写完成之后点击确定:

  • 存储类型:低频访问存储
  • 读写权限:公共读
    Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第2张图片

3、上传文件

点击文件管理->上传文件,右侧就会弹出提示框,然后将文件拖拽进入就可以上传

Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第3张图片

上传之后,会出现下面的内容。点击图片名称就可以看到图片的访问地址,从而尽心进行访问

Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第4张图片

二、Java操作阿里云OSS

1、创建阿里云OSS许可证

在OSS管理界面,点击右侧的 常用入口->Access Key,进入然后在弹窗上点击继续使用Access Key。就进入了AS管理界面
Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第5张图片
点击右侧 创建AccessKey 按钮,在弹窗中输入手机号验证码,就可以创建成功。成功之后,点击保存就会以csv格式将ID和密钥下载到本地。

2、查问OSS文档

OSS Java集成文档

3、Java示例代码

1)引入依赖

<dependency>
    <groupId>com.aliyun.ossgroupId>
    <artifactId>aliyun-sdk-ossartifactId>
    <version>3.8.0version>
dependency>

2)上传文件示例代码

以下代码用于上传文件至OSS:

// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "";
String accessKeySecret = "";
String bucketName = "";
// 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
String objectName = "";

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

// 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。
String content = "Hello OSS";
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));

// 关闭OSSClient。
ossClient.shutdown();

3)下载文件示例代码

// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "";
String accessKeySecret = "";
String bucketName = "";
// 从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
String objectName = "";

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

// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
InputStream content = ossObject.getObjectContent();
if (content != null) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(content));
    while (true) {
        String line = reader.readLine();
        if (line == null) break;
        System.out.println("\n" + line);
    }
    // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
    content.close();
}

// 关闭OSSClient。
ossClient.shutdown();

三、Mocc后端集成OSS

1、在service模块下创建子模块service-oss

Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第6张图片

2、配置pom.xml

service-oss上级模块service已经引入service的公共依赖,所以service-oss模块只需引入阿里云oss相关依赖即可

service父模块已经引入了service-base模块,所以Swagger相关默认已经引入

<dependencies>
    
    <dependency>
        <groupId>com.aliyun.ossgroupId>
        <artifactId>aliyun-sdk-ossartifactId>
    dependency>

    
    <dependency>
        <groupId>joda-timegroupId>
        <artifactId>joda-timeartifactId>
    dependency>
dependencies>

3、创建application.properties

#服务端口
server.port=8081
#服务名
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=guli-file

4、创建启动类

创建OssApplication.java

@SpringBootApplication
@ComponentScan({"cn.hanzhuang42"})
public class OssApplication {

    public static void main(String[] args) {
        SpringApplication.run(OssApplication.class, args);
    }
}

5、启动项目报错

启动项目后可能报错:
Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第7张图片

spring boot 会默认加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration这个类,而DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataSource bean,又因为项目(oss模块)中并没有关于dataSource相关的配置信息,所以当spring创建dataSource bean时因缺少相关的信息就会报错。

解决办法:

方法1、在@SpringBootApplication注解上加上exclude,解除自动加载DataSourceAutoConfiguration(推荐)

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"cn.hanzhuang42"})
public class OssApplication {
}

方法2:在配置文件中加上数据库配置(不推荐)

设置完成之后再次启动就不会报错了。

6、从配置文件读取常量

创建包utils,并在其中创建配置类 AliOssProperties

使用@Value读取application.properties里的配置内容

用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。

package cn.hanzhuang42.oss.utils;

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

@Component
public class AliOssProperties 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;

    /**
     * 属性值初始化之后,该方法会执行
     * 将这些属性值赋值给静态遍历,以便直接通过类名访问
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        END_POINT = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }
}

7、创建Service

创建Service接口:

public interface OssService {

    /**
     * 文件上传至阿里云
     * @param file
     * @return
     */
    String uploadFile(MultipartFile file);

}

创建Service实现类:

package cn.hanzhuang42.oss.service.impl;

import cn.hanzhuang42.oss.service.OssService;
import cn.hanzhuang42.oss.utils.AliOssProperties;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;


@Service
public class OssServiceImpl implements OssService {

    @Override
    public String uploadFile(MultipartFile file) {

        String endpoint = AliOssProperties.END_POINT;
        String accessKeyId = AliOssProperties.ACCESS_KEY_ID;
        String accessKeySecret = AliOssProperties.ACCESS_KEY_SECRET;
        String bucketName = AliOssProperties.BUCKET_NAME;

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

            // 上传文件流。
            InputStream inputStream = file.getInputStream();

            //获取文件名称
            String filename = file.getOriginalFilename();
            //获取不带横杠的uuid
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            //组合成唯一的文件名
            filename = uuid + filename;

            //在文件前边加上日期,用于创建文件夹
            String datePath = new DateTime().toString("yyyy/MM/dd");

	    filename = datePath + "/" +filename;
            //调用oss方法实现上传
            //参数:
            //      bucketName:桶名
            //      filename:文件的上传路径和名称  /abs/aes/01.jpg
            //      inputStream:文件输入流
            ossClient.putObject(bucketName,filename, inputStream);

            //关闭文件输入流
            inputStream.close();

            // 关闭OSSClient。
            ossClient.shutdown();

            //拼接阿里云oss文件路径
            url = "https://" + bucketName + "." + endpoint +"/" + filename;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return url;
    }
}

8、创建Controller

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

    @Autowired
    private OssService ossService;

    @PostMapping("upload")
    public R uploadAvatar(MultipartFile file) {
        //path是Oss中文件的路径
        String path = ossService.uploadFile(file);

        return R.ok().data("url", path);
    }
}

9、Swagger测试

Swagger集成具体方法参看该系列博客第三篇

访问地址,找到相应的接口,点击上传文件进行测试:

Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第8张图片

点击执行,返回结果成功:

Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第9张图片

在OSS控制台中,可以看到上传路径信息:
Mooc项目开发笔记(七):后端集成阿里云OSS存储头像_第10张图片

你可能感兴趣的:(Mooc,项目,后端)