目前项目(springboot)中使用的文件及图片较多,决定自己搭建一个文件服务器用来存储文件,经过参考多个文章搭建成功,遂写下此教程分享给大家:

  Linux系统:Centos 6.5

  FastDFS开源地址:https://github.com/happyfish100,下载最新的:fastdfs-master、libfastcommon-master、fastdfs-nginx-module-master,避免版本问题

  • 一、FastDFS 简介及系统环境搭建
  • 二、FastDFS 配置Nginx模块及访问测试
  • 三、FastDFS 通过java上传文件

一、FastDFS简介及系统环境搭建

1、简介

FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

  Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

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

 

2、系统环境搭建

 上传相关包到/opt/soft_jar/fastdfs下并解压,如图:

下载zip解压工具:

yum install unzip zip -y

解压三个包到/opt/soft下:

unzip -o fastdfs-master.zip -d /opt/soft
unzip -o libfastcommon-master.zip -d /opt/soft
unzip -o fastdfs-nginx-module-master.zip -d /opt/soft

 安装perl:

yum install perl -y

安装gcc:

yum install gcc-c++

安装libfastcommon:

cd /opt/soft/libfastcommon-master
./make.sh
./make.sh install

安装fast:

cd /opt/soft/fastdfs-master
./make.sh

拷贝配置文件:

将fastdfs安装目录下的 conf 下的文件拷贝到/etc/fdfs/下

cp -r conf/* /etc/fdfs/

至此,fastdfs已经安装完毕,接下来配置trackerd和storaged并启动。


配置并启动trackerd

修改trackerd.conf

不改也可以,但是要保证/home/yuqing/fastdfs路径存在

cd /etc/fdfs/
vim tracker.conf

base_path=/home/yuqing/fastdfs 改为:base_path=/data/fastdfs

创建trackerd数据、日志目录

mkdir -p /data/fastdfs

启动trackerd

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

查看trackerd进程,如下图:

说明trackered已经启动起来;其实也可以查看日志:/data/fastdfs/logs/trackerd.log,来判断trackerd是否正常启动起来。

 

配置并启动storaged

修改storage.conf

cd /etc/fdfs/
vim storage.conf

base_path=/home/yuqing/fastdfs 改为:base_path=/data/fastdfs

store_path0=/home/yuqing/fastdfs 改为:store_path0=/data/fastdfs/storage

tracker_server=192.168.209.121:22122 改为:tracker_server=192.168.174.104,这个ip改成自己的

创建storaged数据、日志目录

mkdir -p /data/fastdfs/storage

启动storaged

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

查看storaged进程,如下图:

说明storaged已经启动起来;其实也可以查看日志:/data/fastdfs/logs/storaged.log来判断storaged是否正常启动起来。

查看Storage和Tracker是否在通信:

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

设置开机启动:(可以不配置,文末附启动所有程序的脚本文件)

chkconfig fdfs_trackerd on
chkconfig fdfs_storaged on

文件上传测试:

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 123.jpeg

上传成功后返回文件ID号:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

也可以进入/data/fastdfs/storage/data/00/00 目录下查看。

返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

至此,fastdfs文件服务器已经搭建成功。由于现在还没有和nginx整合无法使用http查看,接下来我们来安装配置nginx~


二、FastDFS 配置Nginx模块及访问测试

1、fastdfs-nginx-module安装

前面已经解压过相关压缩包。

拷贝配置文件

cd /usr/local/fastdfs-nginx-module-master/src

cp mod_fastdfs.conf /etc/fdfs/

编辑配置文件

cd /etc/fdfs/

vi mod_fastdfs.conf

base_path=/tmp 改为:base_path=/data/fastdfs

tracker_server=tracker:22122 改为:tracker_server=192.168.174.104:22122

url_have_group_name = false 改为:url_have_group_name = true;#url中包含group名称

store_path0=/home/yuqing/fastdfs 改为:store_path0=/data/fastdfs/storage

2、nginx安装

nginx依赖包安装

cd /opt

yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel

解压 nginx-1.13.12.tar.gz到 /opt/soft

tar -zxvf nginx-1.13.12.tar.gz -C /opt/soft

安装nginx并添加fastdfs模块

cd nginx-1.13.12
./configure --prefix=/opt/soft/nginx --add-module=/usr/local/fastdfs-nginx-module-master/src
make && make install

检查nginx模块

cd /opt/soft/nginx/sbin
./nginx -V

 已经把fastdfs模块添加进去了。

 配置nginx配置文件

cd /opt/soft/nginx/conf

vim nginx-fdfs.conf

内容如下,server_name注意改成自己的ip:

启动nginx

cd /opt/soft/nginx/sbin/
./nginx -c /opt/soft/nginx/conf/nginx-fdfs.conf

访问图片

文件路径在上面的上传图片的测试代码中有输入,我们进行拼装下:

http://你的IP/group1/M00/00/00/rB4HZF1fA6OAZ1veAAI8OyLpMuI751.jpeg

至此,与nginx整合完成,接下来通过java代码上传文


三、FastDFS 通过java上传文件

在项目(springboot)中使用fastdfs+nginx+mysql实现上传附件的功能,主要原理就是将文件上传到fastdfs服务器得到一个文件的链接路径url,我们获取到这个url,保存到我们的mysql中。

1、添加依赖

<!-- fastdfs -->
<dependency>
	<groupId>org.csource</groupId>
	<artifactId>fastdfs-client-java</artifactId>
	<version>1.27-SNAPSHOT</version>
</dependency>
<dependency>        
	<groupId>commons-io</groupId>        
	<artifactId>commons-io</artifactId>        
	<version>2.4</version>    
</dependency>

<!-- 工具包 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.5.10</version>
</dependency>

由于fastdfs-client-java下载不下来,我们需要下载源码进行maven编译成jar包,手动添加到项目中。(过程不再赘述,不会的自行百度,或者私聊我打包好的jar包)

2、添加配置文件 fdfs_client.conf

connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890

tracker_server = 自己的ip:22122

3、具体实现代码

    /**
     * 上传文件到FastDFS
     *
     * @param file
     */
    public static ResultInfo fastDFSUpload(MultipartFile file) {

        String ext_Name = file.getOriginalFilename().split("\\.")[1];
        String file_Name = file.getOriginalFilename().split("\\.")[0];
        long file_size = file.getSize();

        byte[] bytes = null;
        try {
            bytes = file.getBytes();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String filePath= uploadFile(bytes, ext_Name, file_Name);

        FileQuery fileQuery = new FileQuery();
        fileQuery.setFilePath(filePath);
        fileQuery.setFileName(file_Name);
        fileQuery.setFileSize(file_size);

        return success(ResultConstants.DM_SUCCESS_CODE, "文件上传成功", fileQuery);
    }

    /**
     * FastDFS实现文件下载
     *
     * @param filePath
     */
    public static ResultInfo fastDFSDownload(String filePath) {
        String fileName="";
        try {
            ClientGlobal.init("fdfs_client.conf");

            // 链接FastDFS服务器,创建tracker和Stroage
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getConnection();

            String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
            StorageServer storageServer = getStorageServer(storageServerIp);
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            byte[] b = storageClient.download_file("group1", filePath);
            if (b == null) {
                throw new IOException("文件" + filePath + "不存在");
            }

            fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
            FileOutputStream fileOutputStream = new FileOutputStream("D:/Desktop/fastdfs//" + fileName);
            IOUtils.write(b, fileOutputStream);
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(ResultConstants.DM_SUCCESS_CODE, "文件下载成功", "D:/Desktop/fastdfs//" + fileName);
    }


    /**
     * FastDFS获取将上传文件信息
     */
    public static ResultInfo fastDFSGetFileInfo(String filePath) {
        FileInfo fi = null;
        try {
            // 链接FastDFS服务器,创建tracker和Stroage
            ClientGlobal.init("fdfs_client.conf");
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getConnection();

            String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
            StorageServer storageServer = getStorageServer(storageServerIp);
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);

            fi = storageClient.get_file_info("group1", filePath);
            if (fi == null) {
                throw new IOException("文件" + filePath + "不存在");
            }
            log.debug("文件信息=" + fi.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(ResultConstants.DM_SUCCESS_CODE, "获取将上传文件信息成功", fi.toString());
    }


    /**
     * FastDFS实现删除文件
     */
    public static ResultInfo fastDFSDelete(String filePath) {
        try {
            // 链接FastDFS服务器,创建tracker和Stroage
            ClientGlobal.init("fdfs_client.conf");
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getConnection();

            String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
            StorageServer storageServer = getStorageServer(storageServerIp);
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);

            int i = storageClient.delete_file("group1", filePath);
            log.debug(i == 0 ? "删除成功" : "删除失败:" + i);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResultInfo.success(ResultConstants.DM_SUCCESS_CODE, "删除文件成功");
    }

    public static String uploadFile(byte[] byteFile, String ext_file, String file_Name) {

        // 拼接服务区的文件路径
        StringBuffer sbPath = new StringBuffer();
        sbPath.append("http://自己的ip:8090/");

        try {
            ClientGlobal.init("fdfs_client.conf");

            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;

            StorageClient storageClient = new StorageClient(trackerServer,
                    storageServer);
            //利用字节流上传文件
            NameValuePair[] nvps = new NameValuePair[1];
            nvps[0] = new NameValuePair(file_Name, ext_file);
            String[] strings = storageClient.upload_file(byteFile, ext_file, null);

            sbPath.append(StrUtil.join("/", strings));
            log.info("上传路径=" + sbPath.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sbPath.toString();
    }

也可以封装成工具类直接使用,至此,所有工作已经完成!


总结

搭建过程中只要细心,按照教程一步一步来就不会出什么错;

在此特别感谢提供参考的博主。

附录

一键启动FastDFS和nginx脚本

#!/bin/sh
echo 启动storage
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
echo 启动tracker
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
echo 启动nginx
cd /opt/soft/nginx/sbin/
./nginx -c /opt/soft/nginx/conf/nginx-fdfs.conf
echo 查看fdfs、nginx进程...
ps -ef|grep fdfs
echo fastdfs系统启动完毕!
cd /opt/soft

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐