当前位置:网站首页>46:第四章:开发文件服务:7:在【files】文件服务中,整合阿里OSS;
46:第四章:开发文件服务:7:在【files】文件服务中,整合阿里OSS;
2022-07-21 06:27:00 【小枯林】
说明:
(1)本篇博客内容:在项目中,整合使用阿里OSS;
目录
一:在【imooc-news-dev-common】通用工程中, 整合阿里OSS;
1.在【imooc-news-dev-common】通用工程中,引入阿里OSS依赖;
2.在【files】文件子工程中的UploaderService接口中:定义一个【基于阿里OSS,上传文件的方法】;
附加2.在【files】文件服务的“获取资源文件信息”的配置类,FileResource类中:从file-dev.properties或file-prod.properties中,获取属性值;
3.在【files】文件子工程中的UploaderServiceImpl实现类中:去实现【基于阿里OSS,上传文件的方法】;
4.在【files】文件子工程的FileUploaderController类中,去修改【上传文件,接口】;
一:在【imooc-news-dev-common】通用工程中, 整合阿里OSS;
和【19:第三章:开发通行证服务:2:在程序中,打通阿里云短信服务;初步开发【发送短信,接口】;】一样,对于这种第三方服务的工具性质的内容,我们定义在【common】通用工程中;
PS:要使用OSS;JDK版本需要是1.7及以上;
1.在【imooc-news-dev-common】通用工程中,引入阿里OSS依赖;
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency>
(1)针对我们这儿具体的业务场景;我们上传的方式,选择【流式上传,方式】,而不会选用【文件上传,方式】;然后,具体会选用【流式上传中的,上传网络流的方式】;
(2)即,在我们这儿的业务中,用户在页面上去上传图片时,会得到一个MultipartFile;得到MultipartFile后,我们可以通过MultipartFile得到一个InputStream;然后,就可以使用【流式上传中的,上传网络流的方式】去上传了;
2.在【files】文件子工程中的UploaderService接口中:定义一个【基于阿里OSS,上传文件的方法】;
/** * 上传文件的方法(基于阿里OSS) * @param file:前端传过来的文件;然后,Controller接收文件的时候,是利用MultipartFile去接收的; * @param userId:用户id; * @param fileExtName:文件的扩展名; * @return * @throws Exception */ public String uploadOSS(MultipartFile file, String userId, String fileExtName) throws Exception;
说明:
(1)方法定义说明;
附加1.在【files】文件服务的资源文件file-dev.properties和file-prod.properties中:定义【自己创建的bucket的Endpoint】、【自己创建的bucket的名称】、【自己将要存放用户头像的目录】、【可以指向该bucket的url】;
# 阿里OSS中,自己创建的【imooc-news-dev-wgy】这个bucket的endpoint file.endpoint=oss-cn-shanghai.aliyuncs.com # 使用的bucket的名字:imooc-news-dev-wgy file.bucketName=imooc-news-dev-wgy # 上传文件时,资源的路径;(相当于是在bucket中,创建的不同的目录结构;比如,我们创建的image/face这个目录,就是用于存放用户头像的) file.objectName=image/face # 自己的阿里OSS中:【自己创建的那个Bucket的,名字】+【Endpoint】的路径;通过这个路径,就能在全网唯一确定自己的那台阿里OSS的Bucket; file.ossHost=https://imooc-news-dev-wgy.oss-cn-shanghai.aliyuncs.com/
说明:
(1)Endpoint:自己创建的bucket的Endpoint;
● 有点这种感觉:阿里OSS有很多地区的服务器;自己在创建Bucket的时候,选择的是上海地区,所以Bucket的Endpoint就是【oss-cn-shanghai.aliyuncs.com】;如果选择杭州地区,Bucket的Endpoint就是【oss-cn-hangzhou.aliyuncs.com】;
● 所以,这个Endpoint,有区分不同的阿里OSS的作用;
(2)bucketName:自己创建的bucket的名字;
● 自己在创建Bucket的时候,其Bucket出现了重名的警告;所以,在给Bucket起名字的时候,要注意不要和别人的重名;
● 所以,自己盲猜;在同一地区(比如,自己选择的是上海地区),其Bucket是不能重名的;
● 然后,【Endpoint】+【Bucket 名称】二者组合,就能(在阿里OSS中)唯一确定一个Bucket;
● PS:阿里OSS中的Bucket,就相当于是Redis中的一个库;或者说,像是数据库中的逻辑空间;
(3)objectName;之所以,要定义一个objectName,其逻辑如下:
● 我们创建了一个Bucket;然后,我们以后上传文件时候,就会上传到这个Bucket中;
● 我们后面会上传的文件包括:用户头像,文章封面等;
● 为了更好的区分这些文件,让这些文件的归类更加清晰;我们希望把不同的文件,存放在不同的文件夹中;
● 所以,这儿我们就创建了【file.objectName=image/face】;即,我们上传的用户头像,会存放在【归属于oss-cn-shanghai.aliyuncs.com这个Endpoint的】、【imooc-news-dev-wgy这个Bucket中的】、【/image/face】目录下;
(4)ossHost;之所以,要定义一个ossHost,其逻辑如下:
● 我们把文件上传到阿里OSS后;这个图片是需要在其他地方能够被访问得到的;自然,就需要这个文件的全路径;
● 我们这儿定义的【file.ossHost=https://imooc-news-dev-wgy.oss-cn-shanghai.aliyuncs.com/】;就是将来文件全路径的前半部分;可以看到这路径中,其实就是【https】+【Bucket 名称】+【Endpoint】;
附加2.在【files】文件服务的“获取资源文件信息”的配置类,FileResource类中:从file-dev.properties或file-prod.properties中,获取属性值;
3.在【files】文件子工程中的UploaderServiceImpl实现类中:去实现【基于阿里OSS,上传文件的方法】;
/** * 上传文件的方法(基于阿里OSS) * @param file:前端传过来的文件;然后,Controller接收文件的时候,是利用MultipartFile去接收的; * @param userId:用户id; * @param fileExtName:文件的扩展名; * @return * @throws Exception */ @Override public String uploadOSS(MultipartFile file, String userId, String fileExtName) throws Exception { /** * 1. 构建ossClient;三个参数依次是:【阿里OSS,创建的bucket的Endpoint】、【个人阿里账号的Access Key秘钥的id】、 * 【个人阿里账号的Access Key秘钥的秘钥值】; */ OSS ossClient = new OSSClientBuilder() .build(fileResource.getEndpoint(), aliyunResource.getAccessKeyId(), aliyunResource.getAccessKeySecret()); //2. 根据Controller传过来的MultipartFile(自然,这个MultipartFile,是前端传给Controller层的),得到InputStream流; InputStream inputStream = file.getInputStream(); //3. 利用【前面,我们生成用户id的,雪花算法的工具类】,去生成一个一个随机字符串;作为文件名(的一部分); String fileName = sid.nextShort(); /** * 4. 拼凑资源文件路径; * 我们这儿拼凑的内容是【image/face/当前登录用户的用户id/基于雪花算法生成的文件名.文件扩展名】; * 这儿的意思就是:我们后面向OSS上传文件时,想把文件上传到Bucket的image/face/当前登录用户的用户id/目录下; */ String myObjectName = fileResource.getObjectName() + "/" + userId + "/" + fileName + "." + fileExtName; /** * 5. 上传文件; * 上传流;三个参数依次是:【阿里OSS,创建的bucket的名字】、【资源文件的路径】、【文件流】; */ ossClient.putObject(fileResource.getBucketName(), myObjectName, inputStream); // 6. 上传完毕后,关闭ossClient; ossClient.shutdown(); // 7. 把我们拼接的资源文件路径,返回给Controller;Controller拿到后,会继续拼接这个路径,得到文件的全路径,然后返回给前端; return myObjectName; }
说明:
(1)首先,要在UploaderServiceImpl实现类中,注入三个对象:FileResource、AliyunResource、Sid;
(2)看注释;
4.在【files】文件子工程的FileUploaderController类中,去修改【上传文件,接口】;
5.效果;
(1)先全局install一下整个项目;
(2)然后,启动【user】用户服务、【files】文件服务;
(3)记得使用SwitchHost去开启虚拟域名映射、启动Tomcat把前端项目运行起来;;
……………………………………………………
(4)然后,访问"http://writer.imoocnews.com:8080/imooc-news/writer/accountInfo.html",用户信息完善页面;去上传一个大小不超过500kb的用户头像;
● 在前端浏览器界面上是OK的;
然后,点击【确定】后,其也加载出了新的图片;
● 后端控制台,也打印出了我们预期中的日志信息;
● 然后,再看看前端,其文件路径,也符合我们的预期;
● 然后,再看看阿里OSS;即,以后如果有多个用户的话,就会在/image/face/目录下,会根据不同的用户id,创建不同的文件夹,以存放不同用户的头像文件;
边栏推荐
- Difference between two lists
- [hcip continuous update] DHCP security threat
- Technology sharing | introduction to proxysql binlog reader component (Part 1)
- Diversified system to carry out maker education activities
- [终端_1]-Xshell 5 最火的终端软件!
- 技术分享 | ProxySQL Binlog Reader 组件介绍(上篇)
- LeetCode刷题:二叉树层序遍历相关题目
- In the digital era, the "digital intelligence" transformation of enterprise operation and management
- Business innovation driven by metadata to build new competitive advantages of enterprises
- Role of subnet mask
猜你喜欢
【RM_EE_Note】1 GM6020收发&简单的PID调试
20220719 adapt openharmony-v3.1-beta to aio-3568j
Lens calibration board
来可CAN光端机解决赋安FS5216/FS5116等联动型消防主机消防组网问题
Learn C standard library through examples < ctype h>
[rm_ee_note] 1 gm6020 transceiver & simple PID debugging
Low code tool revolution on the cusp of the storm
OpenShift 4 - 配置OpenShift集群日志环境
Typescript (II)
Unity learning notes - Hot update related
随机推荐
He Bin's full text in C language, with notes for his own use, gives latecomers some ideas
【日常训练】1260. 二维网格迁移
通过例子学C标准库<ctype.h>
dom——页面的渲染过程
Is the Internet midlife crisis really that exaggerated when the same group of "elderly" employees are dismissed?
visual studio引用外部库的注意事项
Read and understand | how data center supports enterprise digital operation
数字化打开第二增长曲线,华为总结运营商云转型三大场景
Detailed explanation of Naomi code
Centos安装Redis
What is the new generation of enterprise IT architecture? Cloud primordial? Low code?
Cannot open source file < stdio. in CUDA file h>
Unity learning notes - Hot update related
Hcip day 9
leetcode刷题03
itk中值滤波
word 2016 奇怪问题:文件保存错误 复制崩溃
Time insertion syntax of Oracle table
Difference between two lists
开展创客教育活动的多元化体系