FastDFS

文章目录

  • linux安装部署FastDFS
  • 使用Docker搭建
  • java代码上传
  • springBoot文件上传一(不推荐使用,但需要知道这种方式)
  • springBoot文件上传二(推荐)

linux安装部署FastDFS

安装fastDFS需要分别安装fastdfs-nginx-module,fastdfs,nginx,libfastcommon
网上有下载,注意版本的搭配
在这里插入图片描述
1、安装gcc(编译时需要)

yum install -y gcc gcc-c++

2、安装libevent (运行时需要

yum -y install libevent

3、安装创建目录上传文件
参考:

mkdir -p /fileservice/fast
cd /fileservice/fast

FastDFS_第1张图片
4、安装libfastcommon

  • 解压文件:tar -zxvf libfastcommon-1.0.35.tar.gz
  • 进入libfast文件目录:cd libfastcommon-1.0.35
  • 执行编译:./make.sh
  • 安装:./make.sh install

5、安装fastdfs

  1. 官方下载地址
    https://sourceforge.net/projects/fastdfs/files/下载很慢
  2. 安装相关依赖库
    yum install perl
    yum install pcre
    yum install pcre-devel
    yum install zlib
    yum install zlib-devel
    yum install openssl
    yum install openssl-devel
  3. 安装fastdfs
    解压文件:tar -zxvf fastdfs-5.11.tar.gz
    进入解压后的目录:cd fastdfs-5.11
    执行编译:./make.sh
    安装:./make.sh install
  4. 查看tracker 和 storage的可执行脚本
    ll /etc/init.d/ grep fdfs
    在这里插入图片描述
  5. 准备配置文件 默认在/etc/fdfs/下面
    cd /etc/fdfs
    FastDFS_第2张图片
    先把配置文件名中的sample去了。建议复制一份。
    cp client.conf.sample client.conf
    cp storage.conf.sample storage.conf
    cp storage_ids.conf.sample storage_ids.conf
    cp tracker.conf.sample tracker.conf
    FastDFS_第3张图片
    然后修改tracker的存放数据和日志的目录。
    mkdir -p /home/fastdfs/tracker

6、配置和启动tracker

  1. 切换到目录到:/etc/fdfs/ 目录下;
  2. 修改tracker.conf
    vim tracker.conf
    base_path=/home/yuqing/fastdfs 改为:
    在这里插入图片描述
  3. 启动tracker,运行如下命令:
    service fdfs_trackerd start
    在这里插入图片描述
    注意:在/home/fastdfs/tracker 目录下生成两个目录, 一个是数据,一个是日志;
    FastDFS_第4张图片

7、配置和启动storage

  1. 切换目录到: /etc/fdfs/ 目录下;

  2. 修改storage.conf
    vi storage.conf
    在这里插入图片描述
    base_path=/home/yuqing/fastdfs 改为:
    base_path=/home/fastdfs/storage
    在这里插入图片描述
    store存放文件的位置(store_path)
    store_path0=/home/yuqing/fastdfs 改为:
    store_path0=/home/fastdfs/storage
    FastDFS_第5张图片
    如果有多个挂载磁盘则定义多个store_path,如下
    store_path1=…
    store_path2=…
    配置tracker服务器:IP
    tracker_server=192.168.59.128:22122
    在这里插入图片描述

  3. 创建/home/fastdfs/storage 目录
    mkdir -p /home/fastdfs/storage
    在这里插入图片描述

  4. 启动storage, 运行命令如下:
    service fdfs_storaged start
    在这里插入图片描述
    启动完成后进入 /home/fastdfs/storage/data 目录下,显示目录如下:
    FastDFS_第6张图片

8、使用FastDFS自带工具测试

  1. 切换目录到 /etc/fdfs/ 目录下;
    cd /etc/fdfs
  2. 修改client.conf ; vi client.conf
    修改基本路径和tracker_server如下:
    FastDFS_第7张图片
    注意:若tracker有多个,可以配置多个,如下:
      tracker_server=…
      tracker_server=…
  3. 拷贝一张图片到Centos服务器上的/etc/fdfs目录下;
    FastDFS_第8张图片
  4. 进行测试
    运行如下(运行测试程序,读取/etc/fdfs/client.conf 文件,上传/etc/fdfs目录下的lol.png文件)
    /usr/bin/fdfs_upload_file ./client.conf ./lol.png在这里插入图片描述
    以上图中的文件地址:http://192.168.59.128/group1/M00/00/00/wKg7gF5w8a6ASQ9bAAy9bu9NQiQ753.png 对应storage服务器上的/home/leige/fastdfs/storage/data/00/00/M00/00/00/wKg7gF5w8a6ASQ9bAAy9bu9NQiQ753.png文件;
    由于现在还没有和nginx整合无法使用http下载。
    FastDFS_第9张图片

9、FastDFS 和nginx整合

  1. 在tracker上安装 nginx在每个tracker上安装nginx,的主要目的是做负载均衡及实现高可用。如果只有一台tracker可以不配置nginx。

    一个tracker对应多个storage,通过nginx对storage负载均衡

  2. 在storage 上安装nginx

    1. 上传fastdfs-nginx-module-1.20.tar.gz 到Centos服务器上

    2. 解压fastdfs-nginx-module-1.20.tar.gz ;
      tar -zxvf fastdfs-nginx-module-1.20.tar.gz

    3. 切换目录到: fastdfs-nginx-module-1.20/src 目录下

    4. cd fastdfs-nginx-module-1.20/src4.修改config文件,将文件中的所有 /usr/local/ 路径改为 /usr/
      修改之后
      FastDFS_第10张图片

    5. 将fastdfs-nginx-module/src下的mod_fastdfs.conf拷贝至/etc/fdfs/下

      cp mod_fastdfs.conf /etc/fdfs/

    6. 并修改 /etc/fdfs/mod_fastdfs.conf 的内容;
      vi /etc/fdfs/mod_fastdfs.conf

      类容如下:
      tracker_server=192.168.59.128:22122
      tracker_server=192.168.172.20:22122 #(多个tracker配置多行)

      FastDFS_第11张图片

      url_have_group_name=true #url中包含group名称
      在这里插入图片描述
      store_path0=/home/fdfs_storage #指定文件存储路径(上面配置的store路径)
      FastDFS_第12张图片

    3.进入之前解压的fastdfs目录下,把http.conf、mime.conf移动至/etc/fdfs

    cp http.conf mime.types /etc/fdfs/
    FastDFS_第13张图片

10、Nginx的安装

  1. 上传 nginx-1.15.2.tar.gz 到Centos服务器上;

  2. 解压 nginx-1.15.2.tar.gz
    tar -zxvf nginx-1.15.2.tar.gz

  3. 进入nginx解压的目录下
    cd nginx-1.15.2/

  4. 加入模块命令配置
    ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/fileservice/fast/fastdfs-nginx-module-1.20/src
    FastDFS_第14张图片

  5. 编译并安装
    make && make install

  6. 修改nginx配置

    cd /opt/nginx/conf

    vim nginx.conf
    FastDFS_第15张图片

  7. 启动nginx
    cd /usr/bin/
    ./nginx #启动

11、在浏览器中访问上传到fastDFS的图片

因为Centos系统有防火墙,需要先关闭掉,才可以在浏览器中访问;
1、CentOS7.0默认使用的是firewall作为防火墙;若没有启用iptables 作为防火墙,则使用以下方式关闭防火墙:
systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

2、若已经启用iptables作为防火墙,则使用以下方式关闭:

service iptables stop #临时关闭防火墙

chkconfig iptables off #永久关闭防火墙

3、在谷歌浏览器中访问刚才上传的图片:

刚才上传的图片地址为:
http://192.168.59.128/group1/M00/00/00/wKg7gF5w8a6ASQ9bAAy9bu9NQiQ753.png
FastDFS_第16张图片

使用Docker搭建

1、下载FastDFS 镜像

docker pull delron/fastdfs

2、查看下载好的镜像

docker images

在这里插入图片描述

3、然后使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用),这里tracker服务将会自动映射到宿主机上

docker run -d --network=host --name tracker -v /home/fastdfsDoc/tracker:/var/fdfs delron/fastdfs tracker

在这里插入图片描述

4、使用docker镜像构建storage容器(存储服务器,提供容量和备份服务),这里storage容器需要依赖tracker服务,传入你的tracker服务的ip地址,端口默认是22122,ip地址也就是你宿主机的ip

docker run -d --network=host --name storage -e TRACKER_SERVER=192.168.59.128:22122 -v /home/fastdfsDoc/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

在这里插入图片描述

5、配置nginx监听端口
a、启动nginx,这里nginx映射到宿主机上

docker run -it --name=myNginx -v /home/fastdfsDoc/nginx:/etc/nginx -p 80:80 nginx

b、修改
FastDFS_第17张图片

6、上传测试
首先将一张照片lol.png放置在宿主机/home/fatsdfsDoc/storage目录下,然后我们进入storage容器里面,运行下面命令:
FastDFS_第18张图片

1、进入容器命令

docker exec -it 97fc6e9d7dbb /bin/bash   

2、运行测试程序,读取/etc/fdfs/client.conf 文件,上传/home/fastdfsDoc/sotraeg目录下的lol.png文件

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf lol.png

FastDFS_第19张图片
通过url 进行访问

java代码上传

1、创建项目导入pom依赖

<dependency>
      <groupId>net.oschina.zcx7878</groupId>
      <artifactId>fastdfs-client-java</artifactId>
      <version>1.27.0.0</version>
    </dependency>
    <!-- spring-core -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.25.RELEASE</version>
    </dependency>

2、创建fdfs_client.conf

# 连接超时时间
connect_timeout=30
# 网咯连接超时时间
network_timeout=60
# 在宿主机中的位置
base_path=/home/fastdfsDoc/storage
# 服务器IP 地址
tracker_server = 192.168.59.128:22122

log_level=info

use_connection_pool = false

connection_pool_max_idle_time = 3600

load_fdfs_parameters_from_tracker=false

use_storage_id = false

storage_ids_filename = storage_ids.conf

http.tracker_server_port=80

3、测试类进行文件上传

package com.hyf;

import org.csource.fastdfs.*;
import org.springframework.core.io.ClassPathResource;

import java.io.IOException;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args ) throws Exception {
        // 需要上传的本机文件地址
       String uploadFilePath = "E:/images/stationmaster_img.png";
       // 获取配置文件绝对路径
       String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();

       // 1、加载配置文件,配置文件中的类容就是tracker 服务的地址
        ClientGlobal.init(filePath);
       // 2、创建一个 TrackerClient 对象。直接 new 一个
        TrackerClient trackerClient = new TrackerClient();
        // 3、使用TrackerClient 对象创建连接,获得 Tracker 对象
        TrackerServer trackerServer = trackerClient.getConnection();
        // 4、创建一个 storageServer 的引用,值为 null
        StorageServer storageServer = null;
        // 5、创建一个StorageClient 对象,需要2个参数对象,StorageServer 的引用
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        // 6、使用 StorageClinet 对象传送图片
        String [] strings = storageClient.upload_file(uploadFilePath,"png",null);
        // 7、返回数组。包含组名和图片的路径。
        for (String string : strings) {
            System.out.println(string);
        }
        System.out.println("上传完成");

    }
}

结果:
FastDFS_第20张图片
FastDFS_第21张图片

springBoot文件上传一(不推荐使用,但需要知道这种方式)

1、创建springBoot 过程导入相关的 pom 依赖

<dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

2、配置yml文件

fastdfs:
  connect_timeout_in_seconds: 100
  network_timeout_in_seconds: 100
  charset: UTF-8
  tracker_services: 192.168.59.128:22122 # 如果需要骗子多个就用 , 隔开

3、创建UploadService

  • 初始化 fastDFS 的环境,和上传代码
package com.hyf.fastdfsspringboot1.utils;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-18 23:57
 * 

* connect_timeout_in_seconds: 100 * network_timeout_in_seconds: 100 * charset: UTF-8 * tracker_services */ @Component public class UploadService { // IP 地址 @Value("${fastdfs.tracker_services}") private String tracker_services; @Value("${fastdfs.connect_timeout_in_seconds}") private int connect_timeout_in_seconds; @Value("${fastdfs.network_timeout_in_seconds}") private int network_timeout_in_seconds; @Value("${fastdfs.charset}") private String charset; public Map<String, Object> upload(MultipartFile multipartFile) { if (multipartFile == null) { throw new RuntimeException("文件不能为空"); } // 上传到 fastDFS,返回 id String fileId = this.fdfsUpload(multipartFile); if (StringUtils.isEmpty(fileId)) { System.out.println("上传失败"); throw new RuntimeException("上传失败"); } Map<String, Object> map = new HashMap<>(); map.put("code", 200); map.put("msg", "上传成功"); map.put("code", fileId); // 文件地址 return map; } /** * 上传至 fastDFS * @param multipartFile */ private String fdfsUpload(MultipartFile multipartFile) { // 初始化环境 initFdfsConfig(); // 直接 new 一个 trackerClient TrackerClient trackerClient = new TrackerClient(); try { // 使用TrackerClient 创建连接对象Connection ,获得TrackerService 对象 TrackerServer trackerServer = trackerClient.getConnection(); // 获取到 StorageService 服务 StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); // 获取到 StorageClient StorageClient1 storageClient1 = new StorageClient1(trackerServer, storageServer); // 文件上传 //获得文件扩展名 String originalFilename = multipartFile.getOriginalFilename(); // 截取到该文件是以 .什么结尾 String substring = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); // 上传 String fileId = storageClient1.upload_appender_file1(multipartFile.getBytes(), substring, null); return fileId; } catch (Exception e) { System.out.println(); return null; } } /** * 初始化 fastDFS 的环境 */ public void initFdfsConfig() { try { ClientGlobal.initByTrackers(tracker_services); ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds); ClientGlobal.setG_network_timeout(network_timeout_in_seconds); ClientGlobal.setG_charset(charset); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } } }

4、controller

package com.hyf.fastdfsspringboot1.controller;

import com.hyf.fastdfsspringboot1.utils.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 0:29
 */
@RestController
@RequestMapping("upload")
public class UploadController {

    @Autowired
    private UploadService uploadService;

    /*
    * 文件上传
    * */
    @RequestMapping("doUpload")
    public Map<String,Object> doUpload(MultipartFile mf){
        Map<String, Object> upload = uploadService.upload(mf);
        return  upload;
    }
}

5、index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<hr>
<form action="/upload/doUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="mf">
    <input type="submit" value="上传">
</form>
</body>
</html>

上传文件得到该返回的 json
在这里插入图片描述

在这里插入图片描述

springBoot文件上传二(推荐)

1、创建springBoot过程导入相关pom依赖:

<dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.7</version>
        </dependency>

2、yml

fdfs:
  so-timeout: 2500            #读取时间
  connect-timeout: 600       #连接超时时间
  thumb-image:               #缩略图
    width: 100
    height: 100
  tracker-list:              #tracker 服务配置地址
     - 192.168.59.128:22122

upload:
   base-url : http://192.168.59.128:8888/
   allow-types:
     - image/jpeg
     - image/png
     - image/bmp
     - image/gif

3、自定义配置类,读取yml文件数据

package com.hyf.fastdfsspringboot2.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 21:10
 */
@ConfigurationProperties(prefix = "upload")
public class UploadProperties {
    private  String baseUrl;   // 访问的IP地址
    private  List<String> allowTypes; //文件类型

    public String getBaseUrl() {
        return baseUrl;
    }

    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    public List<String> getAllowTypes() {
        return allowTypes;
    }

    public void setAllowTypes(List<String> allowTypes) {
        this.allowTypes = allowTypes;
    }
}

4、文件上传工具类

package com.hyf.fastdfsspringboot2.utlis;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.hyf.fastdfsspringboot2.config.UploadProperties;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 22:00
 */
@Component
@EnableConfigurationProperties(UploadProperties.class)
public class UploadService {

    private Log log= LogFactory.getLog(UploadService.class);

    @Autowired
    private FastFileStorageClient storageClient; // 封装好了文件上传的接口

    @Autowired
    private  UploadProperties properties;

    public  String uploadImage(MultipartFile file){

        //  判断文件类型是否匹配
        String contentType = file.getContentType();
        if(!properties.getAllowTypes().contains(contentType)){
               throw new RuntimeException("文件类型不匹配");
        }
        //  校验文件类容
        try {
            BufferedImage image = ImageIO.read(file.getInputStream());
            if(image == null && image.getWidth() == 0 && image.getHeight() == 0){
                throw new RuntimeException("上传文件有问题");
            }
        } catch (IOException e) {
            log.error("校验文件内容失败....{}", e);
            throw new RuntimeException("校验文件内容失败"+e.getMessage());
        }

        try {
        // 上传到 fastDFS
          // 获取扩展名
        String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
            System.err.println("------------file.getOriginalFilename()----------"+file.getOriginalFilename());
            // 上传
            StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(),extension,null);
            System.err.println("------------file.getInputStream()----------"+file.getInputStream());
            // 返回的路径
            return  properties.getBaseUrl()+storePath.getFullPath();
        } catch (IOException e) {
            log.error("【文件上传】上传文件失败!....{}", e);
            throw  new RuntimeException("【文件上传】上传文件失败!"+e.getMessage());
        }
    }
}

5、controller

package com.hyf.fastdfsspringboot2.controller;

import com.hyf.fastdfsspringboot2.utlis.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 0:29
 */
@RestController
@RequestMapping("upload")
public class UploadController {

    @Autowired
    private UploadService uploadService;

    /*
    * 文件上传
    * */
    @RequestMapping("doUpload")
    public Map<String,Object> doUpload(MultipartFile mf){
        System.out.println("--------------mf___________"+mf.getOriginalFilename());
        String filePath = uploadService.uploadImage(mf);
        Map map = new HashMap();
        map.put("path",filePath);
        return  map;
    }
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<hr>
<form action="/upload/doUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="mf">
    <input type="submit" value="上传">
</form>
</body>
</html>

运行测试:

FastDFS_第22张图片

你可能感兴趣的:(fastDFS)