上一篇我们讲解了如何配置和启动FastDFS客户端,以及客户端上传下载的一些常用命令。那么,在许多需要进行分布式文件上传与下载的系统中,就不能像执行Linux命令一样去上传和下载文件,它们需要使用开发系统的语言去操作客户端使用其命令与服务端进行交互,此时FastDFS提供有PHP以及JAVA的连接样例,我们这里主要讲解使用FastDFS提供的Java客户端来进行FastDFS的交互。
首先在FastDFS的官方Github地址https://github.com/happyfish100中,我们可以看到提供的Java客户端的样例工程:
点开之后我们可以看到源码和安装以及配置的说明:
下面我们来根据官网提供的说明来编写一个Java客户端,首先在eclipse中创建一个maven工程:
然后编写POM配置文件,指定编译版本,junit、fastdfs-client-java以及commons-io依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.com.fastdfs.client.test</groupId>
<artifactId>fdfs_client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
我们会发现报错了,本地仓库没有fastdfs-client-java的依赖:
此时我们需要在https://github.com/happyfish100/fastdfs-client-java 下载客户端,解压后使用CMD命令窗口打开解压后所在文件夹,完后并执行mvn clean install命令:
然后看到“BUILD SUCCESS”后,在fastdfs-client-java-master\target下会生成fastdfs_client.jar的依赖包:
然后执行以下命令将该jar包安装至本地maven仓库:
mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=1.27-SNAPSHOT -Dpackaging=jar -Dfile=C:\Users\Administrator\Desktop\fastdfs-client-java-master\fastdfs-client-java-master\target\fastdfs-client-java-1.27-SNAPSHOT.jar
然后去本地仓库下查看,客户端的依赖已经生成:
然后我们回到eclipse,将工程“Update Project”,就会发现报错消失了:
然后我们在src/main/resources下创建一个配置文件fdfs_client.conf,内容如下:
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.195.129:22122
可以看到和我们之前在linux中配置的client.conf的参数基本上一样,除了tracker_server,其它参数都是可选的,都有默认值。这里我们将追踪服务器的地址和端口配置上去。
然后我们在src/main/java下创建一个测试类TestFastDFS.java:
package fdfs_client;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestFastDFS {
public String conf_filename = System.getProperty("user.dir")+"\\src\\main\\resources\\fdfs_client.conf";
public String local_filename = "D:\\test.doc";//要上传的文件
@Before
public void setUp() throws Exception {}
@After
public void tearDown() throws Exception {}
@Test
public void testUpload() {
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
// NameValuePair nvp = new NameValuePair("age", "18");
NameValuePair nvp[] = new NameValuePair[] {
new NameValuePair("name", "test_doc"),
new NameValuePair("desc", "the test file") };
String fileIds[] = storageClient.upload_file(local_filename, "doc",
nvp);
System.out.println(fileIds.length);
System.out.println("组名:" + fileIds[0]);
System.out.println("路径: " + fileIds[1]);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
}
}
首先测试FastDFS的连接以及上传,使用ClientGlobal.init方法来进行配置文件的加载,然后使用TrackerClient获取TrackerServer的连接,进而与追踪服务器进行交互,获取StorageClient。
然后的上传,使用storageClient.upload_file方法,传入需要上传的文件的根目录,文件类型,和文件附属的一些参数,文件上传成功后,可以获得返回的组名和存储路径。测试结果:
我们可以使用storageClient.download_file方法,带上组和文件名来进行文件下载,这里是下载的我们在之前测试Linux客户端时上传的有HelloWorld的txt文件:
@Test
public void testDownload() {
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
byte[] b = storageClient.download_file("group1",
"M00/00/00/wKjDgltBkACEPjBxAAAAAHfj3SA788.txt");
System.out.println("byte's length:"+b.length);
IOUtils.write(b, new FileOutputStream("D:/"
+ UUID.randomUUID().toString() + ".txt"));
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果:
在D盘中生成了相关的文件,并且打开之后可以看到之前存储的HelloWorld信息:
然后使用storageClient.get_file_info可以获取相关文件信息:
@Test
public void testGetFileInfo() {
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
FileInfo fi = storageClient.get_file_info("group1",
"M00/00/00/wKjDgltBkACEPjBxAAAAAHfj3SA788.txt");
System.out.println(fi.getSourceIpAddr());
System.out.println(fi.getFileSize());
System.out.println(fi.getCreateTimestamp());
System.out.println(fi.getCrc32());
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果:
可以看到获得了文件存储服务器的ip、文件大小、文件创建日期、文件的crc32校验信息。
使用storageClient.get_metadata获得文件的metadata信息,也就是之前我们在上传文件时,在NameValuePair中存储的信息(这里获取的就是之前上传的doc文件):
@Test
public void testGetFileMate() {
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
NameValuePair nvps[] = storageClient.get_metadata("group1",
"data/00/00/wKjDgltBkACEPjBxAAAAAHfj3SA788.txt");
for (NameValuePair nvp : nvps) {
System.out.println(nvp.getName() + ":" + nvp.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果:
刚好是之前我们放进去的信息。
使用storageClient.delete_file进行文件的删除,这里我们删除之前上传的doc文件:
@Test
public void testDelete() {
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
int i = storageClient.delete_file("group1",
"M00/00/00/wKjDgltBsCyATs9JAAAABzTycws375.doc");
System.out.println(i == 0 ? "删除成功" : "删除失败:" + i);
} catch (Exception e) {
e.printStackTrace();
}
}
运行之前:
一个是文件本身,一个是文件的metadata信息。运行删除程序之后:
服务器中:
可以看到,doc文件和metadata信息文件都被成功删除了。
客户端样例源代码见我的GitHub:https://github.com/ZhuYaoGuang/fdfs_client.git
至此,java客户端的配置、连接和使用讲解完毕。有兴趣的童鞋可以将该客户端与Spring进行结合,在实际工程项目中使用。
标签:Java,java,fastdfs,FastDFS,storageClient,client,tracker,new,分布式文件系统 From: https://blog.51cto.com/u_16012040/6166632