将fastdfs客户端整合到spring boot并实现上传文件功能

一、引入fastdfs客户端依赖

1、从fastdfs客户端的pom文件把这个依赖复制一下!

<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.29-SNAPSHOT</version>

将fastdfs客户端整合到spring boot并实现上传文件功能_第1张图片
2、把上边那一段依赖复制到通用依赖common-util里,引入fastdfs客户端依赖
将fastdfs客户端整合到spring boot并实现上传文件功能_第2张图片
3、这里引入依赖的时候有一个坑!!!
因为fastdfs客户端自带log4j日志依赖,会和spring boot框架本身的logback日志冲突。
将fastdfs客户端整合到spring boot并实现上传文件功能_第3张图片
4、所以这里,在引入common通用工具包的同时,在引入fastdfs客户端依赖的同时加标签剔除掉fastdfs的log4j日志依赖!!!
将fastdfs客户端整合到spring boot并实现上传文件功能_第4张图片
5、否则,如果不排除这个log4j日志记录,就可能会引起堆栈溢出异常,直接运行会报错。
将fastdfs客户端整合到spring boot并实现上传文件功能_第5张图片

二、简单测试上传本地的一张图片到fastdfs服务器

1、先建一个测试类,测试一下本地路径的图片上传到fastdfs服务器是否成功了?
这里发现:22122和23000端口无法连接,经查,是一个老问题,linux的系统端口没开放,这里就可以把这两个端口开放即可!

firewall-cmd --permanent --add-port=22122/tcp
firewall-cmd --reload
firewall-cmd --permanent --add-port=23000/tcp
firewall-cmd --reload

将fastdfs客户端整合到spring boot并实现上传文件功能_第6张图片
将fastdfs客户端整合到spring boot并实现上传文件功能_第7张图片
2、在resources目录下创建一个tracker.conf的文件,设置tracker客户端连接到tracker服务端的ip地址(这里是Linux的ip地址:tracker服务端口)

tracker_server=172.25.0.11:22122

#连接超时时间,针对socket套接子函数connect,这里设置为30秒
connect_timeout=30000

#连接之后,上传下载的交互超时时间,这里设置为60秒
network_timeout=60000

将fastdfs客户端整合到spring boot并实现上传文件功能_第8张图片

3、再次运行一下,成功上传,并且返回一个string类型的列表,直接打印的话,只能得到这个数据列表的地址。这是一个列表数据!!!!
将fastdfs客户端整合到spring boot并实现上传文件功能_第9张图片
4、需要用for循环把里面的字符串数据遍历出来并且测试打印。
将fastdfs客户端整合到spring boot并实现上传文件功能_第10张图片
5、打印出来的不是完整的URL地址,还需要补全这个地址。

for (String uploadInfo : uploadInfos) {
    imgUrl += "/" + uploadInfo;     //理解好这里,这个string列表共两个数据,第一个是group1,第二个是M00/00/00/rBkAC18ZnmiAeOu4AAGphk1biTI146.jpg
    //第一个循环就是"http://172.25.0.11"+"/"+"group1"
    //第二个循环就是"http://172.25.0.11/group1"+"/"+"M00/00/00/rBkAC18ZnmiAeOu4AAGphk1biTI146.jpg"
    //最终得到完整的URL:"http://172.25.0.11/group1/M00/00/00/rBkAC18ZnmiAeOu4AAGphk1biTI146.jpg"
}

6、最终打印出来的URL地址是一个完整地址,直接复制到浏览访问即可。
这里测试一下,访问成功,显示刚才上传的图片,完美!
将fastdfs客户端整合到spring boot并实现上传文件功能_第11张图片

三、把上传文件(图片、音视频等)到fastdfs服务器的方法封装成类,方便以后直接调用即可!

1、接下来考虑一个问题就是,以后还有很多地方要用到这个上传或者下载(图片或者音视频)的方法,姑且这里应该要把这个方法给封装起来
将fastdfs客户端整合到spring boot并实现上传文件功能_第12张图片
这样的话,如果有其他地方也要用到上传文件的功能直接调用这个类的上传图片的方法即可,非常的方便!!!

2、封装类代码如下(深刻理解里面的注释):
简单整理一下思路:
(1)注入本身类反射到/tracker.conf的路径得到一个链接地址
(2)初始化链接地址
(3)创建tracker客户端对象
(4)创建storage客户端对象(tracker客户端的tracker服务端,null)
(5)storage客户端的upload_file方法上传文件(文件路径或二进制流,文件类型,元数据(可为null)),并返回一个URL字符串列表。
二进制流直接文件点getBytes方法即可
获取文件类型(获全名getOriginalFilename,取最后的点的位置lastIndexOf,截取点的后面字符串substring)
(6)把这个列表数据遍历出来,拼接成完整的URL返回给前端即可!

public class PmsUploadUtil {
    //上传图片到服务器
    public static String uploadImage(MultipartFile multipartFile) {
        String imgUrl = "http://172.25.0.11";   //linux系统的ip地址,待拼接的字符串

        //配置fastdfs的全局连接地址
        String tracker = PmsUploadUtil.class.getResource("/tracker.conf").getPath(); //注入本身类反射得到这个/tracker.conf路径

        try {
            ClientGlobal.init(tracker); //初始化链接地址
        } catch (Exception e) {
            e.printStackTrace();
        }

        //创建一个tracker客户端对象
        TrackerClient trackerClient = new TrackerClient();

        try {
            //new一个storage客户端对象获取了(通过tracker客户端获得了tracker的服务,storageServer可以有多个,不清楚,可设为null)
            StorageClient storageClient = new StorageClient(trackerClient.getTrackerServer(), null);    //先new对象,再Ctrl+alt+v生成

            try {

                byte[] bytes = multipartFile.getBytes(); //获得上传文件的二进制对象

                //获取文件后缀名
                String originalFilename = multipartFile.getOriginalFilename();//先获取文件全名称,假设文件名为:a.12.89.b.a.jpg
                int i = originalFilename.lastIndexOf(".");  //获得最后一个点的位置,从左往右数的,0开始,是11
                String extName = originalFilename.substring(i+1);  //i加1位置为12,12到最后位置,就是需要截获的文件类型名jpg。


                //在new一个storage客户端,就可以使用上传方法就可以上传了,并且返回了一个字符串列表!!!
                String[] uploadInfos = storageClient.upload_file(bytes, extName, null); //第一个文件路径或者文件二进制流。第二个文件类型。第三个文件元数据列表(即文件的详细信息,比如那些拍摄地址、时间、分辨率信息列表等),这些数据不需要用到,不用上传,直接设为null


                for (String uploadInfo : uploadInfos) {
                    imgUrl += "/" + uploadInfo;     //理解好这里,这个string列表共两个数据,第一个是group1,第二个是M00/00/00/rBkAC18ZnmiAeOu4AAGphk1biTI146.jpg
                    //第一个循环就是"http://172.25.0.11"+"/"+"group1"
                    //第二个循环就是"http://172.25.0.11/group1"+"/"+"M00/00/00/rBkAC18ZnmiAeOu4AAGphk1biTI146.jpg"
                    //最终得到完整的URL:"http://172.25.0.11/group1/M00/00/00/rBkAC18ZnmiAeOu4AAGphk1biTI146.jpg"


                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return imgUrl;
    }
}

3、最后测试(上传图片),fastdfs服务器返回图片存储的URL地址,前端页面图片右上角打勾了,说明前端已接收到返回的URL地址。
将fastdfs客户端整合到spring boot并实现上传文件功能_第13张图片
4、在浏览器输入返回来的URL地址,正常显示和刚才上传的图片,测试成功!
将fastdfs客户端整合到spring boot并实现上传文件功能_第14张图片

将fastdfs客户端整合到spring boot并实现上传文件功能_第15张图片
将fastdfs客户端整合到spring boot并实现上传文件功能_第16张图片

你可能感兴趣的:(将fastdfs客户端整合到spring boot并实现上传文件功能)