目录
一、开通“对象存储OSS”服务
1、开通“对象存储OSS”服务
二、控制台使用
1、创建Bucket
2、上传默认头像
三、使用RAM子用户
1、进入子用户管理页面
2、设置权限
四、使用SDK
五、创建测试项目
1、创建Maven项目
2、配置pom
六、测试用例
七、将OSS整合进项目
1、基本配置
2、文件上传阿里云
3、文件删除
一、开通“对象存储OSS”服务
为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案- 阿里云OSS。
1、开通“对象存储OSS”服务
点击控制台之后选择服务,在关键词处输入OSS即可找到
二、控制台使用
1、创建Bucket
命名:srb-file
读写权限:公共读
2、上传默认头像
创建文件夹avatar,上传默认的用户头像
三、使用RAM子用户
1、进入子用户管理页面
2、设置权限
添加用户,获取子用户A***essKeyId, A***essKeySecret后,设置oss的权限
四、使用SDK
在OSS的概览页右下角找到“Bucket管理”,点击“OSS学习路径”
点击“java SDK”进入SDK开发文档
五、创建测试项目
1、创建Maven项目
***.atguigu
aliyun-oss
2、配置pom
<dependencies>
<!--aliyunOSS-->
<dependency>
<groupId>***.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
六、测试用例
首先创建bucket并设置权限为公共读,接着判断bucket是否存在
public class OssTest {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-***-hangzhou.aliyuncs.***。
String endpoint = "oss-***-beijing.aliyuncs.***";
// 阿里云账号A***essKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String a***essKeyId = "你的a***essKeyId ";
String a***essKeySecret = "你的a***essKeySecret ";
String bucketName = "存储对象名字";
@Test
public void testCreateBucket() {
// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, a***essKeyId, a***essKeySecret, conf);
// 创建CreateBucketRequest对象。
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
// 设置存储空间的权限为公共读,默认为私有。
createBucketRequest.setCannedACL(CannedA***essControlList.PublicRead);
// 创建存储空间。
ossClient.createBucket(createBucketRequest);
// 关闭OSSClient。
ossClient.shutdown();
}
@Test
public void testDoesBucketExist() {
// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, a***essKeyId, a***essKeySecret, conf);
// 判断存储空间examplebucket是否存在。如果返回值为true,则存储空间存在,如果返回值为false,则存储空间不存在。
boolean exists = ossClient.doesBucketExist(bucketName);
System.out.println(exists);
// 关闭OSSClient。
ossClient.shutdown();
}
}
七、将OSS整合进项目
1、基本配置
新建模块名:service-oss
Pom.xml
<dependencies>
<dependency>
<groupId>***.atguigu</groupId>
<artifactId>service-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok用来简化实体类:需要安装lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--aliyunOSS-->
<dependency>
<groupId>***.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<!--让自定义的配置在application.yaml进行自动提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
application.xml
server:
port: 8130 # 服务端口
spring:
profiles:
active: dev # 环境设置
application:
name: service-oss # 服务名
aliyun:
oss:
endpoint: 你的endponit
keyId: 你的阿里云keyid
keySecret: 你的阿里云keysecret
bucketName: srb-file
配置日志logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>atguiguSrb</contextName>
<!-- 日志的输出目录 -->
<property name="log.path" value="D:/idealworkspace/shangrb/srb_log/oss" />
<!--控制台日志格式:彩色日志-->
<!-- magenta:洋红 -->
<!-- boldMagenta:粗红-->
<!-- cyan:青色 -->
<!-- white:白色 -->
<!-- magenta:洋红 -->
<property name="CONSOLE_LOG_PATTERN"
value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) %green(%logger) %msg%n"/>
<!--文件日志格式-->
<property name="FILE_LOG_PATTERN"
value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] %thread %file:%line %logger %msg%n" />
<!--编码-->
<property name="ENCODING"
value="UTF-8" />
<!-- 控制台日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${ENCODING}</charset>
</encoder>
</appender>
<!-- 文件日志 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${log.path}/log.log</file>
<append>true</append>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${ENCODING}</charset>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 要区别于其他的appender中的文件名字 -->
<file>${log.path}/log-rolling.log</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${ENCODING}</charset>
</encoder>
<!-- 设置滚动日志记录的滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-rolling-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--归档日志文件保留的最大数量-->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1KB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- <logger name="***.atguigu" level="INFO">-->
<!-- <appender-ref ref="CONSOLE" />-->
<!-- <appender-ref ref="FILE" />-->
<!-- </logger>-->
<!-- 开发环境和测试环境 -->
<springProfile name="dev,test">
<logger name="***.atguigu" level="INFO">
<appender-ref ref="CONSOLE" />
</logger>
</springProfile>
<!-- 生产环境 -->
<springProfile name="prod">
<logger name="***.atguigu" level="ERROR">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING_FILE" />
</logger>
</springProfile>
</configuration>
创建启动类ServiceOssApplication
@SpringBootApplication
@***ponentScan({"***.atguigu"})
public class ServiceOssApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceOssApplication.class, args);
}
}
2、文件上传阿里云
从配置文件中读取常量,创建常量读取工具类:OssProperties.java
@Setter
@Getter
@***ponent
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties implements InitializingBean {
private String endpoint;
private String keyId;
private String keySecret;
private String bucketName;
public static String ENDPOINT;
public static String KEY_ID;
public static String KEY_SECRET;
public static String BUCKET_NAME;
//当私有成员被赋值后,此方法自动被调用,从而初始化常量
@Override
public void afterPropertiesSet() throws Exception {
ENDPOINT = endpoint;
KEY_ID = keyId;
KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
创建Service接口:FileService.java
public interface FileService {
/**
* 文件上传至阿里云
*/
String upload(InputStream inputStream, String module, String fileName);
}
实现:FileServiceImpl.java
参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流
@Service
public class fileServiceImpl implements fileService {
@Override
public String upload(InputStream inputStream, String module, String fileName) {
// 创建OSS客户端实例
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(
OssProperties.ENDPOINT,
OssProperties.KEY_ID,
OssProperties.KEY_SECRET);
// 判断bucket是否存在
if(!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)) {
ossClient.createBucket(OssProperties.BUCKET_NAME);
ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedA***essControlList.PublicRead);
}
// 上传文件 设置文件名
String timeFolder = new DateTime().toString("/yyyy/MM/dd/");
fileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf('.'));
String FilePath = module + timeFolder + fileName;
//文件上传至阿里云
ossClient.putObject(OssProperties.BUCKET_NAME, FilePath, inputStream);
// 关闭Client
ossClient.shutdown();
return "https://" + OssProperties.BUCKET_NAME + '.' + OssProperties.ENDPOINT + "/" + FilePath;
}
}
创建controller.admin:FileController.java
@Api(tags = "阿里云文件管理")
@CrossOrigin //跨域
@RestController
@RequestMapping("/api/oss/file")
public class FileController {
@Resource
private FileService fileService;
/**
* 文件上传
*/
@ApiOperation("文件上传")
@PostMapping("/upload")
public R upload(
@ApiParam(value = "文件", required = true)
@RequestParam("file") MultipartFile file,
@ApiParam(value = "模块", required = true)
@RequestParam("module") String module) {
try {
InputStream inputStream = file.getInputStream();
String originalFilename = file.getOriginalFilename();
String uploadUrl = fileService.upload(inputStream, module, originalFilename);
//返回r对象
return R.ok().message("文件上传成功").data("url", uploadUrl);
} catch (IOException e) {
throw new BusinessException(ResponseEnum.UPLOAD_ERROR, e);
}
}
}
3、文件删除
Service接口:FileService.java
/**
* 根据路径删除文件
* @param url
*/
void removeFile(String url);
实现:FileServiceImpl.java
/**
* 根据路径删除文件
* @param url
*/
@Override
public void removeFile(String url) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(
OssProperties.ENDPOINT,
OssProperties.KEY_ID,
OssProperties.KEY_SECRET);
//文件名(服务器上的文件路径)
String host = "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/";
String objectName = url.substring(host.length());
// 删除文件。
ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);
// 关闭OSSClient。
ossClient.shutdown();
}
fileController.java
@ApiOperation("删除OSS文件")
@DeleteMapping("/remove")
public R remove(
@ApiParam(value = "要删除的文件路径", required = true)
@RequestParam("url") String url) {
fileService.removeFile(url);
return R.ok().message("删除成功");
}