FastDFS客户端是什么?
首先我们要复习一下,FashDFS是什么?FastDFS是一个文件管理系统,他里面主要有追踪服务器,存储服务器,当然还包括我们这个FastDFS客户端。
因为我们之间是通过微服务来进行对FastDFS发送对应的访问文件请求,所以微服务也就是客户端,我们需要让FastDFS建立一个客户端让微服务进行使用,打个比喻,FastDFS在在欢迎它的朋友微服务来访问它,FastDFS是不是需要拿一张椅子来给微服务坐下呀,这个椅子就是客户端。
我们该如何建立FastDFS客户端?
首先我们要在上传文件到微服务里面,加入这个依赖,这个依赖可以去我们父工程那里拿,
然后我们需要在yml配置当中配置这些信息:
fdfs代表的是FastDFS,so-timeout代表的是如果你在这个时间范围内还没有连接上的话,那就超时。
connect-timeout代表的是如果你连接上了之后,在这段时间内没有反应,那么就是连接超时了。
thumb-image代表的是缩略图,下面就是缩略图的宽和高,最下面那个就是追踪服务器的地址,这个地址有list,因为你以后可能会写很多个地址,我们这里只写了一个追踪服务器的地址,分别是本机地址跟端口号。其实无论你是哪个服务器,或者哪个微服务也好,我们大多数是使用nginx进行代理转发地址,其实真正访问到了地址,就是你当前的本机号,和端口,区分不同电脑的方法就是本机号,区分不同微服务的方法就是端口号,只要找到你的本机号,也知道对应微服务的端口号,就可以进行访问那个计算机上的微服务。
先来说说这个配置类,第一个就是说明他是配置类,第二个就是输入这个FastDFS的类,第三个就是解决Bean重复注册的问题。为什么会出现这个问题呢?因为可能每次你一打开它就自动注册,那不可避免的事就是他可能会重复注册了,所以为了避免这个问题,需要有这个配置。
接下来我们就需要去在测试类里面去创建类。为什么我们要在测试类里面创建呢?因为我们需要做个测试,进行上传文件到存储服务器,然后在追踪服务器保存记录,然后要进行文件的回显时,在通过追踪服务器去拿到存储服务器地址。
创建好后,我们把预先准备好的代码全部复制过来。
我们来分析一下这个类,首先第一个注解表示了他是一个springboot测试类,第二个注解表示了他在什么环境下运行,这里指定的是Spring环境下运行,所以运行器将会在这个环境下运行。
我们需要封装客户端方法,我们封装了这个是存储服务器的客户端方法,也就是说建立存储服务器和客户端之间的联系方法,封装这个方法之后,我们以后可以通过客户端向存储服务器发送文件,当然,在编写好业务逻辑的情况下,我们接下来的类累要加Test注解,加上这个注解后,我们需要去编写对应的方法,首先我们要写上要上传的文件是什么?我们该如何让系统知道我们要上传哪些文件呢?很简单,用File方法就可以了,我们要告诉系统,我们有这样一个文件存在,所以我们需要new一个,然后在后面放上对应的路径(其实路径我们只需要复制过来就可以了。)
然后我们需要storageClien的上传t方法uploadFile(然后传入输入流信息并且赋予参数(file)),为什么这里需要输入流呢,输入流是获取我们文件的方式,那有人会说为什么不直接用file呢?因为这个是上传文件啊,因为你只是写了个file,并没有真正去获取他,你这个file里面只是有他的文件地址,要真正获取他,你必须要用输入流去获取它。我们用输入流获取它之后就可以把它添加进来这个参数里面。也就是说第一个参数就是要上传的文件。第二个参数就是文件的大小。第三个是文件的后缀,第四个我们就不用去管他直接写null就可以了。可能有人会问,第二个参数,我们不用去写入它的大小吗?其实第二个参数它会自动获取,所以我们不需要写入。
我们可以看到StorePath,这个是什么意思呢?这是一个存储路径的类,我们家在这里是返回一个存储路径,也就是你存到存储服务器的哪里,就封装在这个值里面。
最后输入这两个地址,一个是带组的地址,这个带组的意思是,你上传的文件可能有很多个,所以他给你整理成一个数组,然后去记录你的地址。如果你上传了文件,只有一个,他就会用不带分组的路径给你记录。
这里要说明下这个地址,这个地址一定要是追踪服务器的地址,因为我们这个客户端要访问存储服务器的话,是需要向追踪服务器索要地址,拿到地址我们才可以通过客户端向存储服务器访问文件,所以我们需要在这个配置里面配置上追踪服务器的地址。然后说明一下这个地址是由两部分组成,一个是虚拟机的地址,一个是追踪服务器的端口号。
如果出现错误,说明没有连接上,我们可以在Xshell里面输入
输出这个来查询,虚拟机上正在运行的服务器有哪些?
同样方法,我们用来检测nginx有没有运行?结果也是运行了,那具体是什么问题呢?
这个时候只需要再重启一遍,问题就可能会得到解决了。
你可以看到我们后台这里有两个文件被上传了,一个是带组名的,一个是不带组名的。这是为什么呢?因为我们上面用了一个带组名的方法跟一个不带组名的方法。其中你可以看看控制台带组名的那个开头是group1,如果你上传多个的话,那就是group2,group3一直下去。
我们可以去看看他们有没有被上传成功。
我们应该如何查看呢?首先这个文件是被上传到虚拟机里面,所以我们必须要在虚拟机的存储服务器里面去查看,那我们首先必须访问的是虚拟机的地址,然后把控制台带组名的文件名字写在这个路径里面,也就是在上面我们圈出来的地方,直接复制过来就可以了。然后进行访问就可以访问成功。
然后我们需要在SwitchHosts里面去配置这个地址。我们为什么需要在SwitchHosts里面去配置这样的地址呢?因为我们以后访问这个网页的时候,总不能直接输入ip地址吧,我们需要输入一个域名,在通过这个域名由SwitchHosts来进行解析,把它转变成Ip地址,也就是说你在网页上输入image.leyou.com,通过SwitchHosts就会自动给你转换成192.168.56.101。所以配置好后我们重新启动一下hm49,然后在网址上输入
结果是一样可以访问的。
然后我们还需要去获取缩略图,也就是在表单中,我们需要回显的时候用的缩略图。还记得我们之前封装了这个方法吗?
其实获取缩略图跟上面的方法差不多,只是最后这里不一样,因为我们要获取缩略图的路径,我们只能获取一个,而不需要获取带组的缩略图路径,因为我们表单只有一个框框,显示一个缩略图,所以我们只需要获取不带分组的路径就可以,注意调用配置里的方法getThumbImagePath
我们在运行之后可以看到三个路径:
我们可以保留组路径也就是group1,然后写上后面文件的地址,注意是用60×60那个地址,为什么这里可以保留组路径呢?因为其实一样的,我们保留组路径也好,不带组路径也好,都一样可以访问到图片,因为我们之前配置的上传到这两个路径里面,缩略图就是一个配置,因为后面加了60×60,这相当于一个配置,所以你家在组路径后面就相当于把组路径的图片进行60×60的处理。
我们还需要在Service去封装这个方法,为什么要去封装这个方法呢?和为什么要在service里面封装这个方法呢?
首先我们的目的是什么?我们的目的就是要回显一个URL地址,我们封装了这个方法,就是存储服务器客户端的方法,因为我们需要去回显图片,所以这个肯定和存储服务器的客户端有关系,工作原理是这样的,把请求发送给追踪服务器,追踪服务器在根据记录在存储服务器获取相对应的地址,然后再把这个地址给客户,让客户自己去访问存储服务器。所以这个就是我们需要封装这个方法的原因。但是为什么要在service里面封装呢?因为我们这个页面就是执行业务逻辑的方法,其他层面像pojo是个封装实体类,Mapper是操作数据库的。
然后我们需要在下面写上这些方法,你可以先去获取上传文件的信息,并且输入四个参数,输入流,文件大小。文件后缀。最后一个是null,文件后缀该怎么获取呢?你可以用第一个方法去获取,第一个方法的参数就两个,一个是原始文件,一个是分隔符。就是会问为什么可以用。StringUtils去获取文件后缀,他们不是不在同一个服务器上吗?其实我们刚刚处理的所有方法,都是在存储服务器上处理的,包括这里为什么能直接用StringUtils,就是因为我们在存储服务器上,所以我们能够自己获取,那为什么又能上传文件?是因为我们就写了上传文件的方法,这个你到哪里都可以写的,不一定是在用户那边,所以说,我们目前的操作一切都是在存储服务器上。最终我们拿到他的地址,要返回域名,加上这个文件的地址,当然是组地址,往后容易区分。为什么要加域名上去?具体你看看我上面写的吧。
我们试一下去上传。
可以看到创建成功了。
在数据库里面也能看到对应的信息和地址。