FastDFS系列(一):基本服务器搭建
FastDFS系列(二):SpringBoot集成FastDFS
FastDFS系列(三):FastDFS防盗链
前言
构建依赖
集成逻辑
pom
配置文件
主要逻辑
测试
说明
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包放到项目中进行引用。
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
上面将fdfs依赖的jar包放到本地仓库后,我们可以直接 到项目中,然后就可以开心的玩耍了。
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.1.RELEASE
com.fdfs
study
0.0.1-SNAPSHOT
study
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.csource
fastdfs-client-java
1.29-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-maven-plugin
当前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地址或者域名,为了防止以后有文件迁移的需求,可以弄成配置或者参数
文件访问成功!