概述
我是码赛客1024,本节我们来使用java调用FastDFS进行文件上传等操作。
一、介绍
在上一章节,咱们搭建好了fastdfs服务器,并实现了基于命令的上传测试和web访问。本节,咱们使用Java来调用API实现上传文件到FastDFS。
二、fastdfs-client-java客户端
2.1 准备fastdfs-client-java的包
fastdfs-client-java
是fastdfs官方提供的客户端,但是该jar包在maven仓库中没有,需要我们手动安装到本地库后才能导入使用。
① 下载源码,地址:https://github.com/happyfish100/fastdfs-client-java
或者qq群(1109193029)中下载,github下载会比较慢。
② 解压,并使用cmd进入目录
③ 编译:mvn clean install
④ 安装成功
⑤ 使用如下坐标,导入项目即可
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.29-SNAPSHOT</version>
</dependency>
2.2 创建SpringBoot项目
2.2.1 相关依赖
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.10</version>
<relativePath/>
</parent>
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- fastdfs-client-java 依赖-->
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.29-SNAPSHOT</version>
</dependency>
</dependencies>
application.yml
spring:
servlet:
multipart:
enabled: true
max-file-size: 5MB # 上传文件单个限制
2.2.2 准备页面
resourcesstaticupload.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>
2.2.2 准备controller
@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;
}
}
2.3 上传案例
① 准备fastdfs配置文件
resourcesfdfs_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;
}
}
③ 上传后的效果展示,基于path就可以访问到图片
2.4 删除案例
这里就不写页面了,直接基于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();
}
}
}
2.5 下载案例
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客户端
3.1 说明
fastdfs-client客户端是基于官方api进行的再次封装,方便调用,并且在springboot中集成也非常方便。
地址:https://github.com/tobato/FastDFS_Client
主要特性
- 对关键部分代码加入了单元测试,便于理解与服务端的接口交易,提高接口质量
- 将以前对byte硬解析风格重构为使用 对象+注解 的形式,尽量增强了代码的可读性
- 支持对服务端的连接池管理(commons-pool2)
- 支持上传图片时候检查图片格式,并且自动生成缩略图
- 在SpringBoot当中自动导入依赖
3.2 使用fastdfs-client
3.2.1 导包
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
3.2.2 配置文件
# ===================================================================
# 分布式文件系统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/
3.2.3 上传文件
@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;
}
}
3.2.4 上传缩略图
@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;
}
}
3.3 其他方法
//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());
最后
以上就是从容汉堡为你收集整理的FastDFS-02-JavaAPI一、介绍二、fastdfs-client-java客户端三、fastdfs-client客户端的全部内容,希望文章能够帮你解决FastDFS-02-JavaAPI一、介绍二、fastdfs-client-java客户端三、fastdfs-client客户端所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复