亲测简单易懂可用:阿里云OSS入门实战2(集成到SpringBoot项目中存放用户头像)
大噶好,我们继续延续上一章,学习如何使用OSS存放用户头像代码示例;
- 在application.properties中先加上OSS相关配置,如下图所示,aliyun.oss.file.endpoi为你创建bucket时候所选择的区域节点,可参考上一章2.3创建bucket图中的endpoint参数,aliyun.oss.file.keyid和aliyun.oss.file.keysecret可参考上一章3.2下载的文件,aliyun.oss.file.bucketname为你创建bucket所填写的名称;
#阿里云 OSS
#地域节点
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=LTAI4FyRDZXQc6zj4QeUTySG
aliyun.oss.file.keysecret=YXbgQu0itl2e3LZvUO9IyKmitei15V
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=oss-laofei
- 因为要在代码中要用到配置文件中的这些属性,所以建一个工具类,把这些属性通过@Value注解把配置文件中的属性注入到私有变量中,再通过实现InitializingBean重写afterPropertiesSet方法,当变量注入值了以后在把私有变量赋值给共有静态常量方便代码中调用;
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//读取配置文件中的内容
//当项目启动的时候,使用value注解 Spring会在配置文件中把aliyun.oss.file.endpoint赋值给endpoint
//因为spring 不允许/不支持把值注入到静态变量中,所以当前永远为null,此时需要实现一个接口,重写里面的方法,
@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;
//InitializingBean 会在上面参数加载完后 方法才会执行,这个方法里面把私有变量赋值给静态常量,这样外面通过类名.常量就可以使用
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
- Controller层,提供访问url进行swagger测试,@Api和@ApiOperation可不加, 根据项目需要,这两个是swagger中的注解,swagger是类似postman进行测试接口和生成文档的工具,后面会专门出一篇讲如何集成使用,
@Api(description="阿里云文件管理")
@CrossOrigin //跨域
@RestController
@RequestMapping("/eduoss/fileoss")
public class OssController {
@Autowired
private OssService ossService;
@ApiOperation(value = "文件上传")
@PostMapping("upload")
public Result upload(
@ApiParam(name = "file",value = "文件",required = true)
@RequestParam("file")MultipartFile file){
String uploadUrl = ossService.upload(file);
//返回url对象
return Result.ok().message("文件上传成功").data("url",uploadUrl);
}
}
- service接口和实现类
public interface OssService {
/**
* 文件上传至阿里云
* @param file
* @return
*/
String upload(MultipartFile file);
}
@Service
public class OssServiceImpl implements OssService {
@Override
public String upload(MultipartFile file) {
//获取阿里云存储相关常量
String endPoint = ConstantPropertiesUtils.END_POINT;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
try{
//创建oss实例
OSSClient ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
//获取上传文件流
InputStream inputStream = file.getInputStream();
//获取文件名称
String fileName=file.getOriginalFilename();
//随机值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
//文件名称添加随机值,防止重名
fileName=uuid+fileName;
//把文件按照日期分类
String filePath = new DateTime().toString("yyyy/MM/dd");
//拼接
fileName=filePath+"/"+fileName;
//文件上传至阿里云
//调用oos方法实现上传
//第一个参数Bucket名称
//第二个参数 上传到oss文件路径和文件名称 aa/bb/cc.jpg
//第三个参数 上传文件输入流
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后的文件路径返回
//需要把上传到阿里云oss路径手动拼接出来
String url = "https://"+bucketName+"."+endPoint+"/"+fileName;
return url;
} catch (IOException e) {
e.printStackTrace();
}
return "上传失败";
}
}
-
通过swagger进行测试上传图片;
-
可以看到上图上传成功,然后我们从阿里云的OSS存储空间找一找,看这只老虎在不在里面
源码说明:目前老费业余时间在做一个在线平台教育的项目,SpringBoot+Vue(Element-UI)前后端分离式的框架,目前还在完善中,后续会发博客来供各位大佬批评指导,如果感兴趣可以码云上关注一波,当前这个图片,文件上传的demo我也一并放在这个在线教育平台,后续用户信息添加头像会用到;
项目地址:https://gitee.com/sxfeihj/onlineEducation,环境需要jdk1.8,lombok,maven3,最好是把education_parent(后端)代码down下来,因为图片上传demo是一个单独的服务在service_oss中,依赖父工程中的jar包,启动后可通过http://localhost:8002/swagger-ui.html进行测试