FastDFS 的 Java 客户端集成

本贴最后更新于 1935 天前,其中的信息可能已经时异事殊

关于 FastDFS 的搭建安装可以看上一篇文章 FastDFS 安装配置
这里直接介绍用 SpringBoot 搭建 FastDFS 的测试 Demo。


搭建过程

新建一个 SpringBoot 项目, pom.xml 配置引入:

<!-- https://mvnrepository.com/artifact/cn.bestwu/fastdfs-client-java -->
<dependency>
  <groupId>cn.bestwu</groupId>
  <artifactId>fastdfs-client-java</artifactId>
  <version>1.27</version>
</dependency>

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

在 resources 目录下新建文件: fdfs_client.conf,内容如下:

#连接tracker服务器超时时长
connect_timeout = 2
  
#socket连接超时时长
network_timeout = 30

#文件内容编码 
charset = UTF-8
 
#tracker服务器端口
http.tracker_http_port = 8080

#http.anti_steal_token = no
http.anti_steal.check_token=true
http.secret_key = FastDFS1234567890

#tracker服务器IP和端口(可以写多个)
#自行配置
  tracker_server = [tracker_server_ip]:22122 

新建类 FastDFSClient,作为核心类:

package top.honeybee.fastdfs;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.io.IOUtils;
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;

/**
 * FastDFS文件上传下载工具类
 */
public class FastDFSClient {
	
  //自行配置
  private static final String CONFIG_FILENAME = "src/main/resources/fdfs_client.conf";
  private static final String GROUP_NAME = "group1";
	
  private TrackerClient trackerClient = null;
  private TrackerServer trackerServer = null;
  private StorageServer storageServer = null;
  private StorageClient storageClient = null;

  static{
	  try {
		  ClientGlobal.init(CONFIG_FILENAME);
	  } catch (IOException e) {
		  e.printStackTrace();
	  } catch (MyException e) {
		  e.printStackTrace();
	  }
  }

  public FastDFSClient() throws Exception {
	 trackerClient = new TrackerClient(ClientGlobal.g_tracker_group);
	 trackerServer = trackerClient.getConnection();
	 storageServer = trackerClient.getStoreStorage(trackerServer);;
	 storageClient = new StorageClient(trackerServer, storageServer);
  }

  /**
   * 上传文件
   * @param file 文件对象
   * @param fileName 文件后缀名
   * @return
   */
  public  String[] uploadFile(File file, String fileName) {
	  return uploadFile(file,fileName,null);
  }

  /**
   * 上传文件
   * @param file 文件对象
   * @param fileName 文件名
   * @param metaList 文件元数据
   * @return
   */
  public  String[] uploadFile(File file, String fileName, Map<String,String> metaList) {
	  try {
		  byte[] buff = IOUtils.toByteArray(new FileInputStream(file));
		  NameValuePair[] nameValuePairs = null;
		  if (metaList != null) {
			  nameValuePairs = new NameValuePair[metaList.size()];
			  int index = 0;
			  for (Iterator<Map.Entry<String,String>> iterator = metaList.entrySet().iterator(); iterator.hasNext();) {
				  Map.Entry<String,String> entry = iterator.next();
				  String name = entry.getKey();
				  String value = entry.getValue();
				  nameValuePairs[index++] = new NameValuePair(name,value);
			  }
		  }
		  return storageClient.upload_file(GROUP_NAME,buff,fileName,nameValuePairs);
	  } catch (Exception e) {
		  e.printStackTrace();
		  return null;
	  }
  }

  /**
   * 获取文件元数据
   * @param groupName 组名
   * @param fileId 文件ID
   * @return
   */
  public Map<String,String> getFileMetadata(String groupname,String fileId) {
	  try {
		  NameValuePair[] metaList = storageClient.get_metadata(groupname,fileId);
		  if (metaList != null) {
			  HashMap<String,String> map = new HashMap<String, String>();
			  for (NameValuePair metaItem : metaList) {
				  map.put(metaItem.getName(),metaItem.getValue());
			  }
			  return map;
		  }
	  } catch (Exception e) {
		  e.printStackTrace();
	  }
	  return null;
  }

  /**
   * 删除文件
   * @param groupName 组名
   * @param fileId 文件ID
   * @return 删除失败返回-1,否则返回0
   */
  public int deleteFile(String groupname,String fileId) {
	  try {
		  return storageClient.delete_file(groupname,fileId);
	  } catch (Exception e) {
		  e.printStackTrace();
		  return -1;
	  }
  }

  /**
   * 下载文件
   * @param groupName 组名
   * @param fileId 文件ID(上传文件成功后返回的ID)
   * @param outFile 文件下载保存位置
   * @return
   */
  public  int downloadFile(String groupName,String fileId, File outFile) {
	  FileOutputStream fos = null;
	  try {
		  byte[] content = storageClient.download_file(groupName,fileId);
		  fos = new FileOutputStream(outFile);
		  InputStream ips = new ByteArrayInputStream(content); 
		  IOUtils.copy(ips,fos);
		  return 0;
	  } catch (Exception e) {
		  e.printStackTrace();
	  } finally {
		  if (fos != null) {
			  try {
				  fos.close();
			  } catch (IOException e) {
				  e.printStackTrace();
			  }
		  }
	  }
	  return -1;
  }

  public static void main(String[] args) throws Exception {
	FastDFSClient client = new FastDFSClient();
    	
	//测试文件上传
	File file = new File("F:\\新建文件夹\\background3.jpg");
	System.out.println(file.exists());
	String[] result = client.uploadFile(file, "jpg");
	System.out.println(result.length);
	System.out.println(result[0]);
	System.out.println(result[1]);

	//测试文件下载
	File file2 = new File("F:\\新建文件夹\\a.jpg");
	System.out.println(client.downloadFile(result[0], result[1], file2));

	//测试文件删除
	System.out.println(client.deleteFile(result[0], result[1]));
  }

}

执行函数返回:
imagepng

基类已经测试成功啦,小伙伴们可以先去试试,也可以自行根据需求扩展接口...

  • FastDFS

    FastDFS 是用 C 语言编写的一款开源分布式文件系统。FastDFS 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

    17 引用 • 10 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3165 引用 • 8206 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 163 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • nuaa123

    😋 谢谢指正哈 ^_^

  • 其他回帖
  • nuaa123

    请问这和 nginx 的静态资源代理有啥区别吗?😳

    1 回复
  • StefanYang
    作者

    这俩好像扯不上什么关系吧?fastdfs 是一个分布式文件系统,包括上传下载同步文件等等,而静态资源代理是把资源重定向过去了

    1 回复

推荐标签 标签

  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 7 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 18 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 430 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    66 引用 • 124 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • OnlyOffice
    4 引用 • 19 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 1 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 346 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 3 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 41 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 636 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 212 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    81 引用 • 122 回帖 • 614 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    163 引用 • 1446 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    3 引用 • 74 回帖 • 3 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 275 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 56 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 294 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 8 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 426 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖