我是码赛客1024,本节我们来使用java调用FastDFS进行文件上传等操作。
在上一章节,咱们搭建好了fastdfs服务器,并实现了基于命令的上传测试和web访问。本节,咱们使用Java来调用API实现上传文件到FastDFS。
fastdfs-client-java
是fastdfs官方提供的客户端,但是该jar包在maven仓库中没有,需要我们手动安装到本地库后才能导入使用。
① 下载源码,地址:https://github.com/happyfish100/fastdfs-client-java
或者qq群(1109193029)中下载,github下载会比较慢。
② 解压,并使用cmd进入目录
<dependency>
<groupId>org.csourcegroupId>
<artifactId>fastdfs-client-javaartifactId>
<version>1.29-SNAPSHOTversion>
dependency>
pom.xml
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.10version>
<relativePath/>
parent>
...
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.csourcegroupId>
<artifactId>fastdfs-client-javaartifactId>
<version>1.29-SNAPSHOTversion>
dependency>
dependencies>
application.yml
spring:
servlet:
multipart:
enabled: true
max-file-size: 5MB # 上传文件单个限制
resources\static\upload.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件title>
head>
<body>
<form id="fileForm" action="/upload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file"> <br>
<input type="submit" value="上传">
form>
body>
html>
@RestController
public class FileController {
@RequestMapping("/upload")
public Map<String,Object> uploadFile(MultipartFile file){
//1.调用fastdfs-client-java实现上传
//2.返回结果
Map<String,Object> map = new HashMap<>();
map.put("path","文件路径");
return map;
}
}
① 准备fastdfs配置文件
resources\fdfs_client.conf
tracker_server=192.168.229.4:22122 #tracker的地址
在application.yml
中增加自定义配置,因为我的fastdfs运行在192.168.229.4这台服务器上,nginx也是配置在里边的。
base:
file:
url: http://192.168.229.4:8888/
② 实现上传
@RestController
public class FileController {
@Value("${base.file.url}") //获取yml中的路径
private String BASE_FILE_URL;
@RequestMapping("/upload")
public Map<String,Object> uploadFile(MultipartFile file){
Map<String,Object> map = new HashMap<>();
try {
//1.调用fastdfs-client-java实现上传
//1.1 加载配置文件
ClientGlobal.init("fdfs_client.conf");
//1.2 创建TrackerClient对象
TrackerClient tracker = new TrackerClient();
//并获取TrackerServer对象
TrackerServer trackerServer = tracker.getTrackerServer();
//1.3 创建StorageClient
StorageClient storageClient = new StorageClient(trackerServer);
//1.4 上传文件
//获取文件后缀名
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//执行上传:参数1:文件的字节数组,参数2:文件的后缀名,参数3:文件的元数据
String[] resultArr = storageClient.upload_file(file.getBytes(), suffix, null);
String groupName = resultArr[0]+"/"; //组名
String filePath = resultArr[1]; //文件路径
//2.返回结果
map.put("path",BASE_FILE_URL+groupName+filePath);
map.put("msg","上传成功");
}catch (Exception e){
e.printStackTrace();
map.put("msg","上传失败");
}
return map;
}
}
这里就不写页面了,直接基于main进行测试。
public class MyTest{
public static void main(String[] args) {
try {
//1、加载配置文件
ClientGlobal.init("fdfs_client.conf");
//2、创建TrackerClient对象
TrackerClient tracker = new TrackerClient();
//并获取TrackerServer对象
TrackerServer trackerServer = tracker.getTrackerServer();
//3、创建StorageClient
StorageClient storageClient = new StorageClient(trackerServer);
//4、删除文件, 参数1:组名,参数2:文件路径
int delete = storageClient.delete_file("group1", "M00/00/00/wKjlBGNsjNiAZlIoAACs7ev0sfI039.png");
System.out.println(delete==0?"删除成功":"删除失败");
}catch (Exception e){
e.printStackTrace();
}
}
}
public class MyTest{
public static void main(String[] args) {
try {
//1、加载配置文件
ClientGlobal.init("fdfs_client.conf");
//2、创建TrackerClient对象
TrackerClient tracker = new TrackerClient();
//并获取TrackerServer对象
TrackerServer trackerServer = tracker.getTrackerServer();
//3、创建StorageClient
StorageClient storageClient = new StorageClient(trackerServer);
//4、下载文件(字节数组), 参数1:组名,参数2:文件路径
byte[] fileData = storageClient.download_file("group1", "M00/00/00/wKjlBGNsi1aAfvPtAAE3u81sxQY134.png");
}catch (Exception e){
e.printStackTrace();
}
}
}
fastdfs-client客户端是基于官方api进行的再次封装,方便调用,并且在springboot中集成也非常方便。
地址:https://github.com/tobato/FastDFS_Client
主要特性
<dependency>
<groupId>com.github.tobatogroupId>
<artifactId>fastdfs-clientartifactId>
<version>1.27.2version>
dependency>
# ===================================================================
# 分布式文件系统FDFS配置开始
# ===================================================================
fdfs:
so-timeout: 1500 #读取时间
connect-timeout: 600 #连接超时时间
thumb-image: #缩略图生成参数
width: 150
height: 150
tracker-list: #TrackerServer列表,支持多个
- 192.168.229.4:22122
pool:
#从池中借出的对象的最大数目(配置为-1表示不限制)
max-total: -1
#获取连接时的最大等待毫秒数(默认配置为5秒)
max-wait-millis: 5000
#每个key最大连接数
max-total-per-key: 50
#每个key对应的连接池最大空闲连接数
max-idle-per-key: 10
#每个key对应的连接池最小空闲连接数
min-idle-per-key: 5
# ===================================================================
# 分布式文件系统FDFS配置结束
# ===================================================================
spring:
servlet:
multipart:
enabled: true
max-file-size: 5MB # 上传文件单个限制
base:
file:
url: http://192.168.229.4:8888/
@RestController
public class FileController {
@Value("${base.file.url}") //获取yml中的路径
private String BASE_FILE_URL;
@Autowired //注入fastdfs-client客户端
private FastFileStorageClient fastFileStorageClient;
@RequestMapping("/upload")
public Map<String,Object> uploadFile(MultipartFile file){
Map<String,Object> map = new HashMap<>();
try {
//获取文件后缀
String originalFilename = file.getOriginalFilename();
String fileExtName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//1.上传文件
//参数1: 文件输入流
//参数2: 文件大小
//参数3: 文件后缀
//参数4: 元数据
StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), fileExtName, null);
//2.获取上传后的文件路径。例如:group1/M00/00/00/wKjlBGNsoFmAcyzjAACs7ev0sfI188.png
String fullPath = storePath.getFullPath();
//3.返回结果
map.put("path",BASE_FILE_URL+fullPath);
map.put("msg","上传成功");
}catch (Exception e){
e.printStackTrace();
map.put("msg","上传失败");
}
return map;
}
}
@RestController
public class FileController {
@Value("${base.file.url}") //获取yml中的路径
private String BASE_FILE_URL;
@Autowired //注入fastdfs-client客户端
private FastFileStorageClient fastFileStorageClient;
@RequestMapping("/upload1")
public Map<String,Object> uploadFile1(MultipartFile file){
Map<String,Object> map = new HashMap<>();
try {
//获取文件后缀
String originalFilename = file.getOriginalFilename();
String fileExtName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//1.上传原图+缩略图
//参数1: 文件输入流
//参数2: 文件大小
//参数3: 文件后缀
//参数4: 元数据
//上传缩略图:
StorePath storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), fileExtName, null);
//2.获取上传后的文件路径,
String fullPath = storePath.getFullPath();
// 原图:group1/M00/00/00/wKjlBGNsoFmAcyzjAACs7ev0sfI188.png
// 缩略图:group1/M00/00/00/wKjlBGNsoFmAcyzjAACs7ev0sfI188_150x150.png
//3.返回结果
map.put("path",BASE_FILE_URL+fullPath);
map.put("msg","上传成功");
}catch (Exception e){
e.printStackTrace();
map.put("msg","上传失败");
}
return map;
}
}
//1.删除方法。
// groupName:组名
// path:文件路径
void deleteFile(String groupName, String path);
//2.下载文件
<T> T downloadFile(String groupName, String path, DownloadCallback<T> callback);
//例如:
byte[] data = fastFileStorageClient.downloadFile("group1", "M00/00/00/dosaihdas.jpg", new DownloadByteArray());