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

    😋 谢谢指正哈 ^_^

推荐标签 标签

  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    393 引用 • 3380 回帖 • 1 关注
  • Ubuntu

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

    123 引用 • 168 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 22 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 590 关注
  • Swagger

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

    26 引用 • 35 回帖 • 7 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • Maven

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

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

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖
  • 心情

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

    59 引用 • 369 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 380 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 321 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 370 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 2 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖
  • JWT

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

    20 引用 • 15 回帖 • 18 关注
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    12 引用 • 26 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 36 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • Scala

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

    13 引用 • 11 回帖 • 101 关注
  • 导航

    各种网址链接、内容导航。

    37 引用 • 168 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 444 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 674 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 106 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 6 关注
  • InfluxDB

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

    2 引用 • 47 关注