FastDFS 的 Java 客户端集成

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

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

    3206 引用 • 8217 回帖
  • Spring

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

    950 引用 • 1460 回帖 • 2 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • StefanYang
    作者

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

    1 回复
  • 其他回帖
  • nuaa123

    😋 谢谢指正哈 ^_^

  • nuaa123

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

    1 回复

推荐标签 标签

  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 633 关注
  • 开源中国

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

    7 引用 • 86 回帖
  • Markdown

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

    173 引用 • 1559 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    110 引用 • 153 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    105 引用 • 908 回帖
  • 小说

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

    33 引用 • 108 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 284 关注
  • 周末

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

    14 引用 • 297 回帖 • 1 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • 运维

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

    151 引用 • 257 回帖 • 1 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 11 关注
  • Follow
    4 引用 • 13 回帖 • 19 关注
  • sts
    2 引用 • 2 回帖 • 260 关注
  • H2

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

    11 引用 • 54 回帖 • 691 关注
  • 电影

    这是一个不能说的秘密。

    125 引用 • 610 回帖
  • SendCloud

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

    2 引用 • 8 回帖 • 545 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 123 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    27 引用 • 7 回帖 • 92 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    51 引用 • 200 回帖 • 2 关注
  • 心情

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

    59 引用 • 369 回帖 • 1 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    126 引用 • 83 回帖 • 1 关注