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 回帖 • 1 关注
  • Spring

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

    938 引用 • 1456 回帖 • 163 关注

相关帖子

欢迎来到这里!

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

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

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

    1 回复
  • StefanYang
    作者

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

    1 回复
  • nuaa123

    😋 谢谢指正哈 ^_^

推荐标签 标签

  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 489 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 223 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 151 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 352 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 652 关注
  • flomo

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

    3 引用 • 74 回帖 • 2 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 637 关注
  • 互联网

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

    96 引用 • 330 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 7 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 456 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 224 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • GitHub

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

    207 引用 • 2031 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 6 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 496 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 395 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 676 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖 • 2 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    60 引用 • 287 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    534 引用 • 671 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 39 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注
  • 微服务

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

    96 引用 • 155 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 454 关注