系列文章
FastDFS系列(二):SpringBoot集成FastDFS
目录
前言
FastDFS用于构建文件和图片服务器是非常方便的,当前FastDFS的作者余大只提供了java调用的方式以及相关Api,玩C语言的朋友可以去找找资料,有相关的资料但是不是很全面。
要了解单服务器部署fdfs的可以看我的上一篇文章,下面还会构建集群和集成DHT,废话不多说,进入本篇的正题——SpringBoot中如何集成FastDFS。
本系列源码请访问:https://github.com/Wenzx1993/FastDFS
构建依赖
SpringBoot集成FastDFS需要依赖 fastdfs-client-java 这个jar包,里面包含了java调用fdfs的环境初始化逻辑,上传、下载、删除等对fdfs文件的操作方式。
因为余大并未将jar包放到大型的包服务器上进行管理,所以这里直接从仓库拉是不行的,这里采用本地构建依赖的方式引用jar包,当然也可以直接将jar包放到项目中进行引用。
- 访问git项目地址:https://github.com/happyfish100/fastdfs-client-java ,下载当前项目压缩包
- 主项目稳定性不保证,生产等需要稳定的环境建议下载正式的稳定版本 (当前非生产,采用当前主版本 1.29)
- 选择 master 版本下载 .zip 结尾的压缩包到本地桌面,然后解压到桌面上
- 用相关开发工具(这里推荐 idea)打开 fastdfs-client-java-master 项目,然后运行 npm install
- 将构建后的 jar 包从 target 目录下拿出来放到桌面上(不用换位置也可以,不过后面要注意路径问题)
- 接下里就是最重要的步骤,将 fastdfs-client-java-1.29-SNAPSHOT.jar 这个包添加到本地仓库中,通过 mvn 构建的方式,在下图3的位置运行 mvn 命令,除了 fastdfs-client-java-1.29-SNAPSHOT.jar 的位置,其他都可以不变
mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=1.29-SNAPSHOT -Dpackaging=jar -Dfile=C:\Users\wenzx\Desktop\fastdfs-client-java-1.29-SNAPSHOT.jar
- 构建完成过户可以看到相关的打印信息,jar包也可以在本地仓库中寻找到
集成逻辑
上面将fdfs依赖的jar包放到本地仓库后,我们可以直接 </dependency> 到项目中,然后就可以开心的玩耍了。
-
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fdfs</groupId>
<artifactId>study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>study</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.29-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
当前springboot版本 2.3.1.RELEASE,因为本地要测试,所以添加了请求相关的 spring-boot-starter-web
-
配置文件
#fastDFS连接超时时间,针对socket套接字函数connect
connect_timeout_in_seconds = 5
#fastDFS网络超时时间
network_timeout_in_seconds = 30
#编码格式
charset = UTF-8
#是否启用token验证(针对fdfs配置文件http.conf,防盗链)
http_anti_steal_token = false
#连接密钥(http.conf要配置一样的密钥)
http_secret_key = FastDFS1234567890
#tracker服务器访问端口
http_tracker_http_port = 80
#tracker服务器地址,多个以逗号隔开
tracker_server = 192.168.1.106:22122
#是否启用连接池
connection_pool.enabled = true
#每一个IP:Port的最大连接数,0为没有限制
connection_pool.max_count_per_entry = 500
#每一个连接的最大空闲时间
connection_pool.max_idle_time = 3600
#达到最大连接数时候的最大等待时间
connection_pool.max_wait_time_in_ms = 1000
本配置文件为 fastdfs-client.properties ,放在项目 resources 下面,这里配置token验证看自己选择,主要是基本验证和防盗链,如果选择配置,要注意 http_secret_key 是否跟服务器端 http.conf 中一致(默认都是:FastDFS1234567890)
注意:当前配置属性前面不要加 fdfs
-
主要逻辑
@Service
public class UploadService {
public String upload(MultipartFile file) {
//获取文件名
String filename = file.getOriginalFilename();
//获取文件类型
//TODO 最好根据content-type来判断
String extName= "";
if(filename.contains("."))
{
extName = filename.substring(filename.lastIndexOf(".")+1);
}
try {
StorageClient storageClient = buildClient();
//返回结果,第一个为组名,第二个为fdfs磁盘地址
String[] result = storageClient.upload_file(file.getBytes(), extName, null);
return new StringBuffer(result[0]).append("/").append(result[1]).toString();
} catch (IOException | MyException e) {
e.printStackTrace();
}
return "上传失败!";
}
/**
* 构建上传对象
* @return
*/
public StorageClient buildClient() throws IOException, MyException {
ClientGlobal.init("fastdfs-client.properties");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
StorageClient storageClient = new StorageClient(trackerServer);
return storageClient;
}
}
当前是最简单的上传逻辑,有多个storage的可以选择通过创建 StorageServer 来告诉 StorageClient 区分上传。
FastDFS提供的Api功能也是很强大,除了上传,还有删除、修改、下载等。
FastDFS默认返回的是一个数组,数组长度为2,第一个是storage配置的组名( group ),第二个是磁盘后面跟上的详细地址
( M00/00/00/xxxxxxxx.jpg )
测试
这里启动项目,然后通过 postMan 进行测试
- 测试上传
返回的未带上具体的文件所在IP地址或者域名,为了防止以后有文件迁移的需求,可以弄成配置或者参数
- 测试是否能访问
文件访问成功!
说明
- 当前非完整项目代码,需要的请到源码地址查看:https://github.com/Wenzx1993/FastDFS
- FastDFS服务器配置可参考FastDFS系列(一):基本服务器搭建