第一步:导入FastDFS的Jar包
进入https://github.com/happyfish100/fastdfs-client-java,下载文件。可以看到,有很多种生成jar文件的方式,有ant、maven等。
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<scope>system</scope>
<version>1.27-SNAPSHOT</version>
</dependency>
第二步:使用API
-
在src/main/resources目录下创建文件fdfs_client.conf,并添加如下内容
IP和端口根据实际的情况修改。该配置文件的其他选项,参照https://github.com/happyfish100/fastdfs-client-java配置。
connect_timeout = 2 network_timeout = 30 charset = ISO8859-1 http.tracker_http_port = 8080 http.anti_steal_token = no http.secret_key = FastDFS1234567890 tracker_server = IP地址:22122 tracker_server = IP地址:22122 tracker_server = IP地址:22122
注1:tracker_server指向您自己的tracker服务器的IP地址和端口,1-n个
注2:除了tracker_server,其它配置项都是可选的
-
基本的文件上传代码
/** * Create By: 刘建 * Date: 2019/9/25 * Time: 4:12 PM * Description: No Description */ public class FastDFSTest { @Test public void testFastDFS() throws IOException, MyException { //初始化tracker客户端 ClientGlobal.init("fdfs_client.conf"); TrackerClient trackerClient = new TrackerClient(); InputStream in = getClass().getClassLoader().getResourceAsStream("fdfs_client.conf"); byte[] b = new byte[in.available()]; in.read(b); //不要复用它,每次操作文件都进行此操作 TrackerServer trackerServer = trackerClient.getConnection(); //从tracker获取storage StorageClient storageClient = new StorageClient(trackerServer, null); //上传文件到storage服务器 String[] result = storageClient.upload_file(b, "txt", null); System.out.println(Arrays.toString(result)); } }
-
封装成Util 下面是Java操作FastDFS进行文件上传、下载和删除的代码。
public final class FastDFSHelper {
private static final Logger logger = LoggerFactory.getLogger(FastDFSHelper.class);
private static TrackerClient trackerClient;
static {
try {
ClientGlobal.init("fdfs_client.conf");
trackerClient = new TrackerClient();
} catch (IOException | MyException e) {
logger.error("error", e);
}
}
/**
* 向FastDFS上传文件
*
* @param localFilename 本地文件名
* @return 上传成功,返回组名和该文件在FastDFS中的名称;上传失败,返回null
*/
public static void uploadFile(String localFilename) {
TrackerServer trackerServer;
try {
trackerServer = trackerClient.getConnection();
} catch (IOException e) {
logger.error("error", e);
return;
}
StorageClient storageClient = new StorageClient(trackerServer, null);
try {
String[] arr = storageClient.upload_file(localFilename, null, null);
if (arr == null || arr.length != 2) {
logger.error("向FastDFS上传文件失败");
} else {
logger.info("向FastDFS上传文件成功");
}
} catch (IOException | MyException e) {
logger.error("error", e);
} finally {
closeTrackerServer(trackerServer);
}
}
/**
* 从FastDFS下载文件
*
* @param localFilename 本地文件名
* @param groupName 文件在FastDFS中的组名
* @param remoteFilename 文件在FastDFS中的名称
*/
public static void downloadFile(String localFilename, String groupName, String remoteFilename) {
TrackerServer trackerServer;
try {
trackerServer = trackerClient.getConnection();
} catch (IOException e) {
logger.error("error", e);
return;
}
StorageClient storageClient = new StorageClient(trackerServer, null);
File file = new File(localFilename);
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
byte[] content = storageClient.download_file(groupName, remoteFilename);
if (content == null || content.length == 0) {
logger.error("文件大小为空!");
boolean flag = file.delete();
logger.info("删除文件结果:{}", flag);
return;
}
bos.write(content);
logger.info("成功下载文件: " + localFilename);
} catch (IOException | MyException e) {
logger.error("error", e);
} finally {
closeTrackerServer(trackerServer);
}
}
/**
* 从FastDFS删除文件
*
* @param localFilename 本地文件名
* @param groupName 文件在FastDFS中的组名
* @param remoteFilename 文件在FastDFS中的名称
*/
public static void deleteFile(String localFilename, String groupName, String remoteFilename) {
TrackerServer trackerServer;
try {
trackerServer = trackerClient.getConnection();
} catch (IOException e) {
logger.error("error", e);
return;
}
StorageClient storageClient = new StorageClient(trackerServer, null);
try {
int i = storageClient.delete_file(groupName, remoteFilename);
if (i == 0) {
logger.info("FastDFS删除文件成功");
} else {
logger.info("FastDFS删除文件失败");
}
} catch (IOException | MyException e) {
logger.error("error", e);
} finally {
closeTrackerServer(trackerServer);
}
}
private static void closeTrackerServer(TrackerServer trackerServer) {
try {
if (trackerServer != null) {
logger.info("关闭trackerServer连接");
trackerServer.close();
}
} catch (IOException e) {
logger.error("error", e);
}
}
}
上述代码中,因为配置文件 fdfs_client.conf 是不变的,而且 trackerClient 是通过读取 fdfs_client.conf 文件来创建的,所以复用了 trackerClient 。 trackerServer 最好不要复用,因为通过源码可以发现,每次通过 trackerClient.getConnection 获取连接的时候,都会在所有的 trackerServer 中选一个;如果复用,则 trackerServer 就被固定成了一个,失去了多个 trackerServer 的意义。每次操作结束,只需要关闭 trackerServer 。因为从源码中可以发现,作者已经为我们调用了 storageServer.close 方法,并将对象置空。
在实际应用中,应该记录下本地文件名和FastDFS中组名与文件名称的映射关系,在此省略。
参考博客
1、在web项目中使用