FastDFS 的 Java 客户端集成

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

关于 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • Spring

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

    941 引用 • 1458 回帖 • 151 关注

相关帖子

欢迎来到这里!

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

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

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

    1 回复
  • StefanYang
    作者

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

    1 回复
  • nuaa123

    😋 谢谢指正哈 ^_^

推荐标签 标签

  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 107 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 25 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 440 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 512 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 123 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    131 引用 • 3644 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 43 关注
  • Spring

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

    941 引用 • 1458 回帖 • 151 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 21 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 强迫症

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

    15 引用 • 161 回帖 • 5 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 3 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    40 引用 • 24 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 686 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 595 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖