> 文章列表 > 尚融宝16-集成阿里云对象存储OSS服务

尚融宝16-集成阿里云对象存储OSS服务

尚融宝16-集成阿里云对象存储OSS服务

目录

一、开通“对象存储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、设置权限

添加用户,获取子用户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);
}

 

实现:FileServiceImpl.java
参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流

@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("删除成功");
}