首页 > 编程语言 >【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接

【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接

时间:2023-04-03 16:00:55浏览次数:49  
标签:Java java fastdfs FastDFS storageClient client tracker new 分布式文件系统


上一篇我们讲解了如何配置和启动FastDFS客户端,以及客户端上传下载的一些常用命令。那么,在许多需要进行分布式文件上传与下载的系统中,就不能像执行Linux命令一样去上传和下载文件,它们需要使用开发系统的语言去操作客户端使用其命令与服务端进行交互,此时FastDFS提供有PHP以及JAVA的连接样例,我们这里主要讲解使用FastDFS提供的Java客户端来进行FastDFS的交互。



首先在FastDFS的官方Github地址https://github.com/happyfish100中,我们可以看到提供的Java客户端的样例工程:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_fastdfs-client-java


点开之后我们可以看到源码和安装以及配置的说明:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_storageClient_02



下面我们来根据官网提供的说明来编写一个Java客户端,首先在eclipse中创建一个maven工程:

【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_storageClient_03

【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_TrackerClient_04

然后编写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的依赖:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_fastdfs-client-java_05


此时我们需要在https://github.com/happyfish100/fastdfs-client-java 下载客户端,解压后使用CMD命令窗口打开解压后所在文件夹,完后并执行mvn clean install命令:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_TrackerClient_06


然后看到“BUILD SUCCESS”后,在fastdfs-client-java-master\target下会生成fastdfs_client.jar的依赖包:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_TrackerClient_07


然后执行以下命令将该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

【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_fastdfs-client-java_08


然后去本地仓库下查看,客户端的依赖已经生成:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_ClientGlobal_09



然后我们回到eclipse,将工程“Update Project”,就会发现报错消失了:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_TrackerServer_10



然后我们在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方法,传入需要上传的文件的根目录,文件类型,和文件附属的一些参数,文件上传成功后,可以获得返回的组名和存储路径。测试结果:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_TrackerServer_11



我们可以使用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();
	}
}

测试结果:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_storageClient_12


在D盘中生成了相关的文件,并且打开之后可以看到之前存储的HelloWorld信息:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_ClientGlobal_13



然后使用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();
	}
}

测试结果:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_TrackerServer_14


可以看到获得了文件存储服务器的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();
	}
}

测试结果:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_TrackerClient_15


刚好是之前我们放进去的信息。



使用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();
	}
}

运行之前:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_ClientGlobal_16


一个是文件本身,一个是文件的metadata信息。运行删除程序之后:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_ClientGlobal_17


服务器中:


【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接_ClientGlobal_18


可以看到,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

相关文章

  • 性能工具之JMeter两个Java API Demo
    概述本文演示两个通过JavaAPI执行JMeter脚本的示例主要功能在线生成jmx脚本(demo1)加载本地已有jmx脚本(demo2)运行多个Sampler将生成的TestPlan存储为.jmx文件执行单机压测将测试执行结果存储为.jtlor.csv文件示例Maven配置为了开始使用JMeterAPI,我们首先需要将它添加到......
  • java稀疏数组实现实例
    没有原理讲解,仅记录一个实现代码,作为参考和笔记使用如题,稀疏数组仅在原始数组有效数据较少的情况下起压缩空间的作用实现过程:首先为了方便查看和确认,封装一个打印二维数组的方法publicstaticvoidprintArray(int[][]arrays){for(int[]array:arrays){......
  • 114.二叉树展开为链表 Java
    114.二叉树展开为链表给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。示例1:输入:root=[1,2,5,3,4,null,6]输出......
  • 详细解析Java异步线程处理队列任务工具类以及实战
    场景待入快速理解小场景描述:【一群人】来到【一个大厅】办理业务,大厅中有【多个窗口】给我们办理业务。每个人都有自己要办事情,处理过程需要消耗时间。大厅根据人群多少,开始窗口梳理。如果把“一群人”理解成一群待处理的n个【任务】,把这群人排成一个长队就形成了一个【任......
  • 【】Java Error: Port 9095 was already in use
    问题描述JavaError:Port9095wasalreadyinuse问题原因端口被占用导致解决方案Windsow系统netstat-ano|findstr9090查询到占用9090端口的进程PID为9784。tasklist|findstr9784查询到PID为0=7984的进程打开【任务管理器】->【服务】,将对应应用关闭Lin......
  • Java 缺失的特性:扩展方法
    作者:周密(之叶)什么是扩展方法扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改现有类型。调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异。为什么需要扩展方法考虑要实现这样的功能:从Redis取出包含多个商......
  • Java 缺失的特性:扩展方法
    作者:周密(之叶)什么是扩展方法扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改现有类型。调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异。为什么需要扩展方法考虑要实现这样的功能:从Redis取出包含多个商品ID......
  • java vue获取当月第一天和最后一天,当前周一和周日
    1,vue前端,通过moment获取当月第一天和最后一天,当前周一和周日letcurrDate=moment(newDate(),"YYYY-MM-DD");varfirstDay=moment(currDate.startOf("month").valueOf()).format('YYYY-MM-DD');//获取该月份第一天的时间戳varendDay=moment(cur......
  • Java-Day-1(Java了解 + DOS)
    Java-Day-1JAVA分辨了解Java创始人之一:詹姆斯·高斯林解释性语言,编译出.class后是有一个解释器的(编译性语言:C/C++——编译后的代码已经是二进制可以由机器直接执行了)面向对象的(oop)健壮的跨平台性的一个.java编译好的.class文件,无需再次编译,便既能在windows上......
  • Java-Day-2(转义字符 + 注释 + 代码规范 + 变量 + 数据类型)
    Java-Day-2常用转义字符代码中只一个\会默认转义(写在“”里)\t:制表位,可以实现对齐功能,可以看作有一个无形表框(上下两行长度相差不大)\n:换行符,仅换代码行的话\\:一个\,想输出"\\"就要输入四个\\'':一个“,字符串里输出双引号\':一个‘\r:一个回车,光标......