尚融宝16-集成阿里云对象存储OSS服务
目录
一、开通“对象存储OSS”服务
1、开通“对象存储OSS”服务
二、控制台使用
1、创建Bucket
2、上传默认头像
三、使用RAM子用户
1、进入子用户管理页面
2、设置权限
四、使用SDK
五、创建测试项目
1、创建Maven项目
2、配置pom
六、测试用例
七、将OSS整合进项目
1、基本配置
3、文件删除
一、开通“对象存储OSS”服务
为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案- 阿里云OSS。
1、开通“对象存储OSS”服务
点击控制台之后选择服务,在关键词处输入OSS即可找到
二、控制台使用
1、创建Bucket
命名:srb-file
读写权限:公共读
2、上传默认头像
创建文件夹avatar,上传默认的用户头像
三、使用RAM子用户
1、进入子用户管理页面
2、设置权限
添加用户,获取子用户AccessKeyId, AccessKeySecret后,设置oss的权限
四、使用SDK
在OSS的概览页右下角找到“Bucket管理”,点击“OSS学习路径”
点击“Java SDK”进入SDK开发文档
五、创建测试项目
1、创建Maven项目
com.atguigu
aliyun-oss
2、配置pom
<dependencies><!--aliyunOSS--><dependency><groupId>com.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-cn-hangzhou.aliyuncs.com。String endpoint = "oss-cn-beijing.aliyuncs.com";// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。String accessKeyId = "你的accessKeyId ";String accessKeySecret = "你的accessKeySecret ";String bucketName = "存储对象名字";@Testpublic void testCreateBucket() {// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。ClientBuilderConfiguration conf = new ClientBuilderConfiguration();// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, conf);// 创建CreateBucketRequest对象。CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);// 设置存储空间的权限为公共读,默认为私有。createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);// 创建存储空间。ossClient.createBucket(createBucketRequest);// 关闭OSSClient。ossClient.shutdown();}@Testpublic void testDoesBucketExist() {// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。ClientBuilderConfiguration conf = new ClientBuilderConfiguration();// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, 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>com.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>com.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: 你的endponitkeyId: 你的阿里云keyidkeySecret: 你的阿里云keysecretbucketName: 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="com.atguigu" level="INFO">--><!-- <appender-ref ref="CONSOLE" />--><!-- <appender-ref ref="FILE" />--><!-- </logger>--><!-- 开发环境和测试环境 --><springProfile name="dev,test"><logger name="com.atguigu" level="INFO"><appender-ref ref="CONSOLE" /></logger></springProfile><!-- 生产环境 --><springProfile name="prod"><logger name="com.atguigu" level="ERROR"><appender-ref ref="CONSOLE" /><appender-ref ref="ROLLING_FILE" /></logger></springProfile>
</configuration>
创建启动类ServiceOssApplication
@SpringBootApplication
@ComponentScan({"com.atguigu"})
public class ServiceOssApplication {public static void main(String[] args) {SpringApplication.run(ServiceOssApplication.class, args);}}
2、文件上传阿里云
从配置文件中读取常量,创建常量读取工具类:OssProperties.java
@Setter
@Getter
@Component
@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;//当私有成员被赋值后,此方法自动被调用,从而初始化常量@Overridepublic 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);
}
@Service
public class fileServiceImpl implements fileService {@Overridepublic 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, CannedAccessControlList.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);// 关闭ClientossClient.shutdown();return "https://" + OssProperties.BUCKET_NAME + '.' + OssProperties.ENDPOINT + "/" + FilePath;}
}
创建controller.admin:FileController.java
@Api(tags = "阿里云文件管理")
@CrossOrigin //跨域
@RestController
@RequestMapping("/api/oss/file")
public class FileController {@Resourceprivate 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("删除成功");
}