1.前言
今天跟着教程后面终于实现了通过springboot将文件上传到FastDFS里面,还是有点小激动的,今天把过程分享出来,希望能够帮助到大家。
还不知道FastDFS怎么安装或者是怎么整合Nginx的朋友,可以去看我之前的这两篇文章:
分布式文件存储系统fastdfs安装教程
整合FastDFS与Nginx,使生成的文件URL能够通过浏览器访问
2.步骤
2.1clone并将客户端导入到项目
因为FastDFS不像我们其他的框架,直接就可以从Maven仓库下载他相应的依赖,然后直接跟着教程后面敲就行了,他是必须我们先从Git上面把它的客户端Clone下来,然后导入到我们的项目,才能够直接使用的。
所以我们首先需要将客户端clone下来。
找到我们的Git工具,然后以管理员身份运行,之后输入下面的命令就能够将客户端clone先来了
git clone https://github.com/happyfish100/fastdfs-client-java
我们会在Git的目录下面看到这样一个文件:
这就是FastDFS的客户端,之后我们就将这个客户端拷贝到我们的项目中,但是这时候他没有被识别成Maven的项目,所以我们还需要将它导入成Maven项目,按照下面的步骤即可:
之后我们需要将这个项目install到我们的本地仓库,这一步可有可无,但是最好install一下,否则有的时候识别不出来这个项目。
上面红框里面的地址就是它安装的地址
2.2导入FastDFS客户端的依赖
复制这段代码到你需要使用文件上传的模块里面。这里有个小坑,到后面我会告诉大家怎么解决。
2.3创建并配置Tracker的配置信息
在需要文件上传的模块的resource文件夹下面创建配置文件
#tracker_server服务的地址及端口号 tracker_server=tracker服务的IP:22122 #连接超时间,默认是30秒 connect_timeout=30000 #网络通讯超时时间,默认是60秒 network_timeout=60000
2.4编写上传文件的工具类
之后我们就可以正式的来编写我们的工具类了
public static String uploadImage(MultipartFile multipartFile) throws IOException { //这里是我定义的常量类 ConstantUtil constantUtil=new ConstantUtil(); String ImageUrl= constantUtil.getImageUrl(); //获取tracker的配置文件路径 String tracker=PmsUploadUtil.class.getResource("/tracker.conf").getPath(); //读取配置文件 try{ ClientGlobal.init(tracker); }catch (Exception e){ e.printStackTrace(); System.out.println("配置实例化失败"); } TrackerClient trackerClient=new TrackerClient(); TrackerServer trackerServer=trackerClient.getTrackerServer(); //创建一个StorageClient对象,需要两个参数TrackerServer对象、StorageServer的引用 StorageClient storageClient = new StorageClient(trackerServer, null); //获取文件的byte数组 byte[]bytes=multipartFile.getBytes(); //获取文件的后缀名 String multipartFileName=multipartFile.getOriginalFilename(); int index=multipartFileName.lastIndexOf("."); String extNamne=multipartFileName.substring(index+1); //使用StorageClient对象上传图片;扩展名不带“.” try { String[] strings = storageClient.upload_file(bytes, extNamne, null); //返回数组。包含组名和图片的路径。重组成URL链接 for (String string : strings) { ImageUrl+="/"+string; } }catch (Exception e){ e.printStackTrace(); } return ImageUrl; }
这里还有一个注意点就是 FastDFS1.27
和 FastDFS1.29
两个版本有些许的不一样
在1.27的版本里面: 我们获取TrackerServer是通过trackerClient.getConnection()来获取的, 但是在1.29的版本里面: 我们获取TrackerServer是通过trackerClient.getTrackerServer()来获取的,
其次FastDFS中的上传函数主要是下面两种,
这两个函数只有第一个参数存在区别,第一是以二进制数据的形式将文件上传上去,第二个则是通过我们传入的文件的文件路径将文件上传上去。这里我选择的是通过第一种方式将文件进行上传,这里大家根据自己的实际需要进行选择。到这里我们关于文件的上传就已经编写完毕,接下来我们就可以进行测试了,但是不好意思,不出意外的话,你可能会碰到这么个bug:Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError
这个bug的意思就是你项目里面同时使用了 log4j-over-slf4j.jar 和 slf4j-log4j12.jar ,刚好这两个包是冲突的,所以我们必须要将其中一个去掉,但是之前自己的项目都是能够正常运行的,所以不出意外应该是FastDfS客户端里面应该是引用了上面依赖中的一个,所以这里我们重新进FastDFS客户端的pom依赖里面就能够看到他的依赖有哪些,我们可以看到如下图所示:
说明就是因为FastDFS中又引入了其中的一个,所以我们需要在导入fastDFS的依赖里面将该依赖刨除掉
<dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.29-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
这样我们的项目基本就能运行了
3. 上传演示
到了这里我们就可以来进行实际的测试一下了
可以看到图片的确上传上去了,并且后台给我们返回了FastDFS为我们生成的图片的URL地址,我们之后通过浏览器也的确能够进行访问了。