一、新建云存储微服务
1、在service模块下创建子模块service-oss
强行微服务...
2、配置pom.xml
service-oss上级模块service已经引入service的公共依赖,所以service-oss模块只需引入阿里云oss相关依赖即可
<dependencies> <!-- 阿里云oss依赖 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> </dependency> <!-- 日期工具栏依赖 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> </dependencies>
3、配置application.properties
#服务端口 server.port=8002 #服务名 spring.application.name=service-oss #环境设置:dev、test、prod spring.profiles.active=dev # 最大支持文件大小 spring.servlet.multipart.max-file-size=1000MB # 最大支持请求大小 spring.servlet.multipart.max-request-size=1000MB #阿里云 OSS #不同的服务器,地址不同 aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com aliyun.oss.file.keyid=************ aliyun.oss.file.keysecret=*********** #bucket可以在控制台创建,也可以使用java代码创建 aliyun.oss.file.bucketname=edu-f # nacos服务地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
4 创建启动类
创建OssApplication.java
@EnableDiscoveryClient//nacos服务注册 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) //没有配置数据库 @ComponentScan(basePackages = {"com.atguigu"})//扫描各模块的配置类 public class OssApplication { public static void main(String[] args) { SpringApplication.run(OssApplication.class, args); } }
二、实现文件上传
1、从配置文件读取常量
创建常量读取工具类:ConstantPropertiesUtil.java ,使用@Value读取application.properties里的配置内容,用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。
@Component public class ConstantPropertiesUtils 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、文件上传
实现:FileServiceImpl.java
参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流 https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11186623.6.958.177af2eesoCeOU@Servicpublic class OssServiceImpl implements OssSerrvice @Override
public String uploadFileAvatar(MultipartFile file) { //工具类获取值 String endpoint = ConstantPropertiesUtils.END_POINT; String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID; String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET; String bucketName = ConstantPropertiesUtils.BUCKET_NAME; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); InputStream inputStream = null; try { // 获取上传文件流。 inputStream = file.getInputStream(); //获取文件名称 String originalFilename = file.getOriginalFilename(); //1 在文件名称里添加随机唯一的值 String uuid = UUID.randomUUID().toString().replaceAll("-", "");//替换掉字符串中的- originalFilename = uuid + originalFilename; //2 把文件按照日期分类 // 获取当前日期 String datePath = new DateTime().toString("yyyy/MM/dd"); originalFilename = datePath + "/" + originalFilename; ossClient.putObject(bucketName, originalFilename, inputStream); // 关闭OSSClient。 ossClient.shutdown(); //手动拼接路径并返回 String url = "https://" + bucketName + "." + endpoint + "/" + originalFilename; return url; } catch (IOException e) { e.printStackTrace(); } return null; } }
3、控制层
@RestController @RequestMapping("/eduoss/fileoss") public class OssController { @Autowired OssSerrvice ossSerrvice; @PostMapping public R uploadOssFile(MultipartFile file) { //获取上传文件 MultipartFile //返回上传oss的路径 System.out.println("--------"); String url = ossSerrvice.uploadFileAvatar(file); return R.ok().data("url", url); } }