FastDFS

一、是什么?

  fastDFS 是以C语言开发的一项开源轻量级分布式文件系统

  他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载)

  特别适合以文件为载体的在线服务,如图片网站,视频网站等

 二、架构

  由跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)构成。

  客户端请求Tracker server进行文件上传、下载,通过Trackerserver调度最终由Storage server完成文件上传和下载。

       Trackerserver:负载均衡和调度,通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。

       Storageserver:文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

  Client:主要是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器

  1)Tracker 集群
         FastDFS集群中的Tracker server可以有多台,Trackerserver之间是相互平等关系同时提供服务,Trackerserver不存在单点故障。客户端请求Trackerserver采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

  2)Storage集群
         Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storageserver之间不会相互通信,同组内的Storageserver之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

         采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

三、上传配置文件

FastDFSClient工具类 :
package cn.liuhuan.core.util;

import org.csource.fastdfs.TrackerClient;

import org.apache.commons.io.FilenameUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;

import org.csource.fastdfs.TrackerServer;

public class FastDFSClient {

   private TrackerClient trackerClient = null;
   private TrackerServer trackerServer = null;
   private StorageServer storageServer = null;
   private StorageClient1 storageClient = null;

   public FastDFSClient(String conf) throws Exception {
      if (conf.contains("classpath:")) {
         conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
      }
      ClientGlobal.init(conf);
      trackerClient = new TrackerClient();
      trackerServer = trackerClient.getConnection();
      storageServer = null;
      storageClient = new StorageClient1(trackerServer, storageServer);
   }

   /**
    * 上传文件方法
    * <p>Title: uploadFile</p>
    * <p>Description: </p>
    * @param fileName 文件全路径
    * @param extName 文件扩展名,不包含(.)
    * @param metas 文件扩展信息
    * @return
    * @throws Exception
    */
   public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
      String result = storageClient.upload_file1(fileName, extName, metas);
      return result;
   }

   public String uploadFile(byte[] file, String fileName, long fileSize) throws Exception {
      NameValuePair[] metas = new NameValuePair[3];
      metas[0] = new NameValuePair("fileName", fileName);
      metas[1] = new NameValuePair("fileSize", String.valueOf(fileSize));
      metas[2] = new NameValuePair("fileExt", FilenameUtils.getExtension(fileName));
      String result = storageClient.upload_file1(file, FilenameUtils.getExtension(fileName), metas);
      return result;
   }

   public String uploadFile(String fileName) throws Exception {
      return uploadFile(fileName, null, null);
   }

   public String uploadFile(String fileName, String extName) throws Exception {
      return uploadFile(fileName, extName, null);
   }

   /**
    * 上传文件方法
    * <p>Title: uploadFile</p>
    * <p>Description: </p>
    * @param fileContent 文件的内容,字节数组
    * @param extName 文件扩展名
    * @param metas 文件扩展信息
    * @return
    * @throws Exception
    */
   public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {

      String result = storageClient.upload_file1(fileContent, extName, metas);
      return result;
   }

   public String uploadFile(byte[] fileContent) throws Exception {
      return uploadFile(fileContent, null, null);
   }

   public String uploadFile(byte[] fileContent, String extName) throws Exception {
      return uploadFile(fileContent, extName, null);
   }
}

pom.xml依赖:
<!--fastDFS-->
<dependency>
    <groupId>org.csource.fastdfs</groupId>
    <artifactId>fastdfs</artifactId>
    <version>1.2</version>
</dependency>
<!-- 文件上传组件 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>${commons-fileupload.version}</version>
</dependency>

UploadController :
public class UploadController {
    //文件服务器地址
    @Value("${FILE_SERVER_URL}")
    private String FILE_SERVER_URL;
    //上传文件
    @RequestMapping("/uploadFile")
    public Result uploadFile(MultipartFile file){
        try{
            FastDFSClient fastDFSClient = new FastDFSClient("classpath:fastDFS/fdfs_client.conf");
            String path = fastDFSClient.uploadFile(file.getBytes(), file.getOriginalFilename(), file.getSize());
            return new Result(true,FILE_SERVER_URL+path);
        }catch (Exception e){
            e.printStackTrace();
            return new Result(false,"上传失败");
        }
    }
}

  

        

————————————————
版权声明:本文为CSDN博主「bug发现与制造」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KamRoseLee/article/details/80334621

原文地址:https://www.cnblogs.com/shiliuhuanya/p/12073540.html