java 实现FastDFS 文件操作

1.下载FastClient并实现依赖Jar安装

访问余大github项目 地址为fastdfs-client-java下载后导入Idea,修改项目Java编译版本,如图所示:

fastDFS java项目截图
fastDFS java项目截图

使用Maven进行 编译和构建,dos窗口定位到该项目路径下,进行编译和构建

1
E:\fastdfs-client-java-master>mvn clean install

构建成功后,会在maven 本地仓库出现相关Jar包,如图所示:

依赖Jar构建成功
依赖Jar构建成功

在需要进行文件操作的项目模块增加Pom文件依赖配置,配置内容如下:

1
2
3
4
5
6
<!-- fastdfs上传下载图片  路径和上面的pom中对应 -->
<dependency>
<groupId>org.csource.fastdfs-client-java</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27</version>
</dependency>

2.增加FastDFS连接配置文件

在需要的项目模块资源配置文件夹下 src/resource 目录下新增配置文件 fdfs_client.properties
配置内容具体如下:

1
2
3
4
5
6
7
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8088 # tracker Http端口
http.anti_steal_token = no # 暂无作用
http.secret_key = FastDFS1234567890 # 暂无作用
tracker_server = 192.168.43.60:22122 # tracker Server地址信息

3.编写FastClient 工具类,用于封装文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
package com.gsww.ctyxy.util;
import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URLDecoder;

/**
* FastDFS工具类【实现文件上传、下载、删除、查询】
* @author Zhangyongliang
*/
public class FastDFSClient {

private TrackerClient trackerClient = null;
private TrackerServer trackerServer = null;
private StorageServer storageServer = null;
private StorageClient1 storageClient = null;

public FastDFSClient(String conf) throws Exception {
if (conf.contains("classpath:")) {
String path = URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation().toString(),"UTF-8");
path=path.substring(6);
conf = conf.replace("classpath:",URLDecoder.decode(path,"UTF-8"));
}
ClientGlobal.init(conf);
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageServer = null;
storageClient = new StorageClient1(trackerServer, storageServer);
}

/**
* 上传文件方法
* <p>Title: uploadFile</p>
* <p>Description: </p>
* @param fileName 文件全路径
* @param extName 文件扩展名,不包含(.)
* @param metas 文件扩展信息
* @return
* @throws Exception
*/
public String uploadFile(String fileName, String extName, NameValuePair[] metas) {
String result=null;
try {
result = storageClient.upload_file1(fileName, extName, metas);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return result;
}

/**
* 上传文件,传fileName
* @param fileName 文件的磁盘路径名称 如:D:/image/aaa.jpg
* @return null为失败
*/
public String uploadFile(String fileName) {
return uploadFile(fileName, null, null);
}
/**
*
* @param fileName 文件的磁盘路径名称 如:D:/image/aaa.jpg
* @param extName 文件的扩展名 如 txt jpg等
* @return null为失败
*/
public String uploadFile(String fileName, String extName) {
return uploadFile(fileName, extName, null);
}

/**
* 上传文件方法
* <p>Title: uploadFile</p>
* <p>Description: </p>
* @param fileContent 文件的内容,字节数组
* @param extName 文件扩展名
* @param metas 文件扩展信息
* @return
* @throws Exception
*/
public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) {
String result=null;
try {
result = storageClient.upload_file1(fileContent, extName, metas);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return result;
}
/**
* 上传文件
* @param fileContent 文件的字节数组
* @return null为失败
* @throws Exception
*/
public String uploadFile(byte[] fileContent) throws Exception {
return uploadFile(fileContent, null, null);
}

/**
* 上传文件
* @param fileContent 文件的字节数组
* @param extName 文件的扩展名 如 txt jpg png 等
* @return null为失败
*/
public String uploadFile(byte[] fileContent, String extName) {
return uploadFile(fileContent, extName, null);
}

/**
* 文件下载到磁盘
* @param path 图片路径
* @param output 输出流 中包含要输出到磁盘的路径
* @return -1失败,0成功
*/
public int download_file(String path,BufferedOutputStream output) {
int result=-1;
try {
byte[] b = storageClient.download_file1(path);
try{
if(b != null){
output.write(b);
result=0;
}
}catch (Exception e){} //用户可能取消了下载
finally {
if (output != null){
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 获取文件数组
* @param path 文件的路径 如group1/M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg
* @return
*/
public byte[] download_bytes(String path) {
byte[] b=null;
try {
b = storageClient.download_file1(path);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return b;
}

/**
* 删除文件
* @param group 组名 如:group1
* @param storagePath 不带组名的路径名称 如:M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg
* @return -1失败,0成功
*/
public Integer delete_file(String group ,String storagePath){
int result=-1;
try {
result = storageClient.delete_file(group, storagePath);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return result;
}
/**
*
* @param storagePath 文件的全部路径 如:group1/M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg
* @return -1失败,0成功
* @throws IOException
* @throws Exception
*/
public Integer delete_file(String storagePath){
int result=-1;
try {
result = storageClient.delete_file1(storagePath);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return result;
}

/**
* 获取远程服务器文件资源信息
* @param groupName 文件组名 如:group1
* @param remoteFileName M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg
* @return
*/
public FileInfo getFile(String groupName,String remoteFileName){
try {
return storageClient.get_file_info(groupName, remoteFileName);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

4.文件操作

在web 项目Controller层进行文件的操作

上传文件

1
2
3
4
5
6
7
8
9
10
@RequestMapping(value = "file/uploadFast",method = RequestMethod.GET)
public void uploadFast(HttpServletRequest request)throws Exception{
// 1、把FastDFS提供的jar包添加到工程中
// 2、初始化全局配置。加载一个配置文件。
String confUrl=this.getClass().getClassLoader().getResource("/fdfs_client.properties").getPath();
FastDFSClient fastDFSClient=new FastDFSClient(confUrl);
//上传文件
String filePath= fastDFSClient.uploadFile("F:\\Photos\\P70602-192547.jpg");
System.out.println("返回路径:"+filePath);
//省略其他

删除文件

1
2
3
//删除文件
int flag=fastDFSClient.delete_file("group1/M00/00/00/wKgrPFpf94KASn3vAAsC7gailiI018.jpg");
System.out.println("删除结果:" +(flag==0?"删除成功":"删除失败"));

下载文件到桌面

1
2
3
4
5
//下载文件到用户桌面位置
FileSystemView fsv = FileSystemView.getFileSystemView();
File com=fsv.getHomeDirectory(); //读取桌面路径
int downFlag=fastDFSClient.download_file("group1/M00/00/00/wKgrPFpe9OqAWsHxAAH5yvc2jn8251.jpg",new BufferedOutputStream(new FileOutputStream(com.getPath()+"\\aa.jpg")));
System.out.println("下载结果为:" +(downFlag==0?"下载文件成功":"下载文件失败"));

查询文件信息

1
2
3
//获取文件信息
FileInfo file=fastDFSClient.getFile("group1","M00/00/00/wKgrPFpe9OqAWsHxAAH5yvc2jn8251.jpg");
System.out.println("获取文件信息成功:"+file.getFileSize());

说明:在FastDFS工具类中集合了支持字节数组的上传入参。