1、配置pom.xml
<dependencies>
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version> 2.10.1</version>
</dependency>
</dependencies>
2、配置application.properties
#服务端口
server.port=8002
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同
#前后不能加空格,空格也会作为秘钥的一部分
aliyun.oss.file.endpoint="阿里接点"
aliyun.oss.file.keyid="你的accessKeyId"
aliyun.oss.file.keysecret="你的accessKeySecret"
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname="阿里bucketname"
3、创建启动类
//创建OssApplication.java
//如果不需要使用数据库
//@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@SpringBootApplication
@ComponentScan({"com.yzh"})
public class OssApplication {
public static void main(String[] args) {
SpringApplication.run(OssApplication.class, args);
}
}
4、启动项目
报错
spring boot 会默认加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration这个类,
而DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataSource bean,又因为项目(oss模块)中并没有关于dataSource相关的配置信息,所以当spring创建dataSource bean时因缺少相关的信息就会报错。
解决办法:
方法1、在@SpringBootApplication注解上加上exclude,解除自动加载DataSourceAutoConfiguration
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
**
二、实现文件上传
**
1、从配置文件读取常量
创建常量读取工具类:ConstPropertiesUtil.java
使用@Value读取application.properties里的配置内容
用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。
//当项目启动,spring接口,spring加载之后,执行接口一个方法
@Component
public class ConstPropertiesUtils implements InitializingBean {
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
//以上属性初始化完后,会执行此方法
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
2、文件上传
创建Service接口:
public interface OssService {
//文件上传至阿里云
String uploadFileAvatar(MultipartFile file);
}
实现:OssService
参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流
@Service
public class OssServiceImp implements OssService {
//上传头像到oss
@Override
public String uploadFileAvatar(MultipartFile file) {
//用自定义的工具类获取值
String endpoint = ConstPropertiesUtils.END_POINT;
String accessKeyId = ConstPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstPropertiesUtils.BUCKET_NAME;
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
//构建日期路径 2019/02/26/文件名
//使用joda 类
String dateTime = new DateTime().toString("yyyy/MM/dd");
// 上传文件流。
InputStream inputStream = file.getInputStream();
//获取文件名称
String filename = file.getOriginalFilename();
//防止上传文件名重复,会覆盖原来的
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//最终目录
//2020/05/21/fbd563ca582a41daa051327cb3fa84501.jpg"
filename = dateTime+"/"+uuid + filename;
//调用oss方法实现上传
//第一个参数 bucketName
//第二个参数,上传到oss的文件和路径名称 /aa/bb/jj.jpg
//第三个参数 上传文件输入流
ossClient.putObject(bucketName, filename, inputStream);
//获取上传之后的路径
//需要手动拼接上传到阿里云的oss路径
//https://yzh-teacher.oss-cn-beijing.aliyuncs.com/%E9%A3%8E%E6%99%AF1.jpg
String url = "https://" + bucketName + "." + endpoint + "/" + filename;
return url;
} catch (IOException e) {
e.printStackTrace();
return null;
}finally {
// 关闭OSSClient。
ossClient.shutdown();
}
}
}
3、控制层
创建controller:
@RestController
@RequestMapping("/teacher")
@CrossOrigin //跨域
public class OssController {
@Autowired
private OssService ossService;
@PostMapping("uploadAvatar")
public Result uploadAvatar(MultipartFile file) {
String url = ossService.uploadFileAvatar(file);
return Result.success().data("url", url);
}
}