阿里云的 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{
@Autowired
private 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-oss
spring.jackson.data-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.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=0
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
aliyun.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{
@Autowired
private 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{
@Override
public 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);
//关闭OSSClient
ossClient.shutdown();
//上传之后的路径,可以从阿里云工作台的文件详情获取
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
return url;
}catch(IOException e){
e.printStackTrace();
}
}
}