阿里云的 OSS 服务进行云端的文件存储
用户认证需要上传图片、首页轮播需要上传图片,OSS分布式文件服务系统可以提供服务。
一、依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>
二、在配置文件中配置 OSS 服务对应的 accessKey、secretKey 和 endpoint
alibaba.cloud.access-key=your-ak
alibaba.cloud.secret-key=your-sk
alibaba.cloud.oss.endpoint=***
阿里云 accessKey、secretKey 为例,获取方式如下
①、在阿里云控制台界面,单击右上角头像,选择 accesskeys,或者直接登录用户信息管理界面:
②、获取 accessKey、secretKey:
如果使用了阿里云 STS服务 进行短期访问权限管理,则除了 accessKey、secretKey、endpoint 以外,还需配置 securityToken
③、创建Bucket
进入Bucket,上传文件,可以查看上传文件的详情(URL用来访问该文件)
三、注入OSSClient并进行文件上传下载等操作,大量文件对象操作的场景。
@Service
public class YourService{@Autowiredprivate OSSClient ossClient;public void saveFile(){//下载文件到本地ossClient.getObject(new GetObejctRequest(bucketName,objectName),new File("pathOfYourLocalFile"));}
}
如果是仅仅读取文件对象内容,OSS Starter也支持以Resource方式读取文件
①、在应用的 /src/main/resources/application.properties 中添加基本配置信息和 OSS 配置
spring.application.name=oss-example
server.port=18084
alibaba.cloud.access-key=your-ak
alibaba.cloud.secret-key=your-sk
alibaba.cloud.oss.endpoint=***
②、通过IDE直接启动或者编译打包后启动应用
- IDE直接启动:找到主类 OSSApplication,执行 main 方法启动应用
- 打包编译后启动,执行 mvn clean package 将工程编译打包;执行 java -jar oss-example.jar启动应用
应用启动后会自动在 OSS 上创建一个名为 aliyun-spring-boot-test 的 Bucke
@Value("oss://aliyun-spring-boot/oss-test")
private Resource file;//文件内容读取
StreamUtils.copyToString(file.getInputStream(),Charset.forName(CharEncoding.UTF_8));
上传或下载文件
#使用 curl 调用上传接口 upload。该接口会上传 classpath 下的的 oss-test.json 文件。文件内容是一段 json:
curl http://localhost:18084/upload#使用 curl 调用下载接口 download。该接口会下载刚才用 upload 接口上传的 oss-test.json 文件,并打印文件内容到结果中:
curl http://localhost:18084/download
在OSS上验证结果
登陆OSS控制台,可以看到左侧 Bucket 列表新增一个名字为aliyun-spring-boot-test的 Bucket。
单击aliyun-spring-boot-test Bucket,选择 文件管理 页签,发现上传的 oss-test 文件。上传的 objectName 为oss-test.json。目录和文件以’/'符号分割。
===============================================
实战操作
一、导入依赖
<!--阿里云OSS依赖-->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId>
</dependency><!--日期工具栏依赖-->
<dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId>
</dependency>
配置文件application.properties
server.port=8205
spring.application.name=service-ossspring.jackson.data-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8spring.redis.host=192.168.44.165
spring.redis.port=6379
spring.redis.database=0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1#最大阻塞等待时间(附属表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848aliyun.oss.accessKeyId=
aliyun.oss.secret=
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)//无需加载数据库
@EnableDiscoveryClient
@ComponentScan(basePackages={"com.michael"})
public class ServiceOssApplication{public static void main(String[] args){SpringApplication.run(ServiceOssApplication.class,args);}
}
二、网关模块gateway中进行对上传oss模块进行配置
spring.cloud.gateway.routes[4].id=service-oss
spring.cloud.gateway.routes[4].uri=lb://service-oss
spring.cloud.gateway.routes[4].predicates=Path=/*/oss/**
三、文件流的方式上传
Controller
@RestController
@RequestMapping("/api/oss/file")
public class FileApiController{@Autowiredprivate FileService fileService;//将本地文件上传到阿里云@PostMapping("fileUpload")public Result fileUpLoad(MultipartFile file){//SpringMVC中的,可以得到要上传的内容//返回上传后的路径String url = fileService.upload(file);return Result.ok(url);}
}
Service
public interface FileService{String upload(MultipartFile file);
}
@Service
public class FileServiceImpl implements FileService{@Overridepublic String upload(MultipartFile file){//以下变量可以设置到配置文件中,然后通过工具类读取String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";String accessKeyId = "";String accessKeySecret = "";String bucket = "";//创建OSSClient实例OSS occClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);//上传文件流try{InputStream inputStream = file.getInputStream();//从Controller中获取用户上传的文件流String fileName = file.getOriginalFilename();//获取文件名称(包括路径)/**由于同名原因会导致文件上传的覆盖问题,后上传的覆盖前上传的*///采用uuid生成唯一值,添加到文件名称里(并且将里面的-用空串表示)String uuid = UUID.randomUUID().toString().replaceAll("-","");fileName = uuid+fileName;//按照日期创建文件夹,上传到创建文件夹的里面(joda-time日期工具依赖)String timeUrl = new DateTime().toString("yyyy/MM/dd");fileName = timeUrl + "/" + fileName;ossClient.putObject(bucket,fileName,inputStream);//关闭OSSClientossClient.shutdown();//上传之后的路径,可以从阿里云工作台的文件详情获取String url = "https://"+bucketName+"."+endpoint+"/"+fileName;return url;}catch(IOException e){e.printStackTrace();}}
}