今天是刘小爱自学Java的第148天。
感谢你的观看,谢谢你。
学习计划安排如下:
昨天写了新增品牌业务,其中有一个参数是图片,我们并未上传图片。
今天主要就是完成图片上传功能。
因为上传不仅有图片的上传,还可能是其它上传,为了其通用性,创建一个独立的微服务。
一、创建upload微服务
关于微服务的创建,有核心三个步骤:引入依赖、配置文件和启动类编写。
主要说下配置文件中的注意点。
上传微服务对应的端口号:8082。
微服务名称为:upload-service
既然是上传图片,那么要设定上传的大小,不能让任意大小的图片都能上传。
max-file-size:限定上传文件大小,例子中就是一个文件大小不能超过5M。
max-request-size:限定请求数据大小,例子中也就是一次请求最多传10M。
其它的配置比如eureka注册不再赘述。
至于依赖,需要什么在pom文件中引入即可,启动类编写也很简单,以前写过很多遍了。
关于请求
昨天在分析前端页面的时候就说明过:
请求路径/方式
全路径即为上图中对应的url,为网关映射路径+真实路径,真实路径即为image。
请求方式为POST请求。
请求参数
关于参数即为文件file,至于其返回值为一个字符串,即图片文件对应的url。
网关配置映射路径
upload映射路径即对应着upload微服务。
也就是说当浏览器上的访问网关该映射路径时,其实本质上执行的是upload微服务。
二、后台代码编写
因为本身并未对数据库进行操作,所以并没有涉及到Mapper层的代码编写。
1Controller层
无外乎还是这4个内容:
请求路径:真实路径image,上面分析过。
请求方式:POST请求。
请求参数:文件file,这里被封装成了MultipleFile,在学SpringMVC时讲过。
返回值:图片对应的url字符串。
2Service层
既然是图片文件,我们首先要校验其类型,不能是文本文件视频文件;再对图片内容校验。
图片类型校验
MultipartFile有一个getContentType方法,通过它可以获取上传图片的类型。
我们将图片的类型存放在一个集合中,在将集合和上传图片类型比较即可。
比如png文件,jpg文件都是常见的图片文件类型,还有bmp文件,上述忘记说明了。
图片内容校验
我们是将图片存储在nginx中的,创建一个file文件说明对应的html文件夹路径即可。
如果是以前我们需要通过IO流复制该文件,完成图片的上传与保存。
而MultipartFile提供了transferTo()方法可以直接完成文件的复制,根据语义也好理解。
返回图片url
返回一个url,即图片的域名+图片名,关于图片名还可以使用UUID保证名称的唯一性。
PS:为什么图片地址要使用独立的url?
如果是保存在服务器内部,会产生额外的负担,这样显然是不合适的。
如果不使用独立的域名,在访问静态资源时会携带不必要的cookie加大请求的数据量。
所以要使用独立的域名,既然如此那我们要配置图片对应的域名。
三、图片域名及测试
既然返回值中说明了域名,同样的道理,SwitchHosts和nginx完成域名的使用。
这个我们在nginx中专门讲解过反向代理,即第142天的学习笔记。
总之通过它能达到一个什么目的呢?
在浏览器上输入图片对应的全路径,会访问到nginx中html里的文件。
当然再次做一个强调:
该配置只是好看,知道有域名这回事,因为域名需要去买很麻烦,所以只好这么配置。
域名配置完成,代码也编写完毕,做个测试:
利用insomnia来模拟上传图片:
向upload微服务发送请求,服务器接受该请求,将上传的图片保存到了nginx中。
响应状态码是200即表示成功。
我们到对应的html文件夹中可以看到保存的图片,其中因为配置了域名,所以在浏览器上直接用域名也可以访问到图片。
最后
行有不得反求诸己,我是@刘小爱
一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。
领取专属 10元无门槛券
私享最新 技术干货