子模块service_oss
阿里云上注册,然后开通oss对象存储,充一点钱
1.创建bucket
2.上传文件到阿里云oss
第一步创建许可证AccessKey,
AccessKey ID 和 AccessKey Secret 是访问阿里云 API 的密钥,具有该账户完全的权限。
然后通过手机号验证查看并保存id和秘钥。
第二步引入依赖
<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>
</dependency>
日期依赖是为了之后将上传的图片进行文件通过日期分类。
第三步在配置文件里设置id和秘钥,用于之后的读取
#测试oss存储
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=LTAI5t7dFYm7w6KJE79dVgXq
aliyun.oss.file.keysecret=UZCtXo4EJ5hcQ8vQD75LO59CeIXySh
#bucket可以在控制台创建,也可以使用java代码创建(这里是已经在oss控制台创建好的)
aliyun.oss.file.bucketname=test-000821
注意一个地方:
如果将这个功能单独写成一个模块需要在启动类上加上
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)//属性表示不去加载数据库
第四步编写一个工具类来读取上述的值
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//实现这个接口的作用是当项目已启动,spring加载之后会执行接口的一个方法,也就是下面重写的那个方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//常量类,读取配置文件的内容赋值给自己定义的变量,@Value这个注解用来读取配置文件的值
@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;
}
}
第五步编写controller,service以及serviceimpl
@RestController
@CrossOrigin
public class OssController {
@Autowired
private OssService ossService;
@PostMapping("upload")
public String uploadFile(MultipartFile file) {
String url = ossService.uploadFile(file);
return url;
}
}
public interface OssService {
//上传文件到oss
String uploadFile(MultipartFile file);
}
文件名和文件夹以日期格式都可以不改
@Service
public class OssServiceImpl implements OssService{
//上传文件到oss
@Override
public String uploadFile(MultipartFile file) {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = ConstantPropertiesUtils.END_POINT;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 获取上传文件的输入流
InputStream inputStream = file.getInputStream();
//获取文件名称
String fileName = file.getOriginalFilename();
//1.在文件名称里添加随机的唯一的值,避免出现文件同名覆盖问题
String uuid = UUID.randomUUID().toString().replaceAll("-","");
//变成UUIDxxx.jpg这种形式
fileName = uuid + fileName;
//2.把文件按照日期分类
// 20xx/xx/xx/xx.jpg 年月日加日期
//获取当前日期
String datapath = new DateTime().toString("yyyy/MM/dd");
//拼接
fileName = datapath + "/" + fileName;
//调用oss的方法实现上传
//第一个参数bucketname
//第二个参数 文件路径和文件名称,获取文件名称
//第三个参数 文件输入流
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后文件的路径返回
//没有特定的方法,需要自己拼接得到路径
//示例https://edu-0821.oss-cn-beijing.aliyuncs.com/01.jpg
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
return url;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}