zoukankan      html  css  js  c++  java
  • 使用docker搭建FastDFS文件系统

    1.首先下载FastDFS文件系统的docker镜像

    查询镜像

    [root@localhost /]# docker search fastdfs
    1


    安装镜像

    [root@localhost ~]# docker pull season/fastdfs
    [root@localhost ~]# docker images
    1
    2

    2.使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用):


    关闭防火墙

    [root@localhost /]# systemctl stop firewalld
    1
    这里的防火墙也要关

    进入编辑模式:
    [root@localhost /]# vi /etc/sysconfig/selinux
    1
    2
    将SELINUX的值改成disabled,如下:


    改完配置后重启

    [root@localhost /]# reboot
    1
    创建tracker容器

    [root@localhost /]# docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker
    1
    Tracker服务器的端口默认是22122,你可以查看是否启用端口

    [root@localhost /]# netstat -aon | grep 22122
    1

    3.使用docker镜像构建storage容器(存储服务器,提供容量和备份服务):

    docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.115.130:22122 -e GROUP_NAME=group1 season/fastdfs storage
    1

    4.此时两个服务都以启动,进行服务的配置。
    进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在fdfs_conf目录下的storage.conf。

    [root@localhost /]# docker exec -it storage bash
    root@localhost:/# cd fdfs_conf
    root@localhost:/fdfs_conf# more storage.conf
    1
    2
    3

    往下拉,你会发现storage容器的ip不是你linux的ip,如下:

    接下来,退出storage容器,并将配置文件拷贝一份出来:

    [root@localhost ~]# docker cp storage:/fdfs_conf/storage.conf ~/
    [root@localhost ~]# vi ~/storage.conf
    1
    2

    将修改后的配置文件拷贝到storagee的配置目录下:

    [root@localhost ~]# docker cp ~/storage.conf storage:/fdfs_conf/
    1
    重新启动storage容器

    [root@localhost ~]# docker stop storage
    [root@localhost ~]# docker start storage
    1
    2
    查看tracker容器和storage容器的关联

    [root@localhost ~]# docker exec -it storage bash
    root@localhost:/# cd fdfs_conf
    root@localhost:/fdfs_conf# fdfs_monitor storage.conf
    1
    2
    3

    5.在docker模拟客户端上传文件到storage容器
    开启一个客户端

    [root@localhost 00]# docker run -tid --name fdfs_sh --net=host season/fastdfs sh
    1
    更改配置文件,因为之前已经改过一次了,所以现在直接拷贝

    [root@localhost 00]# docker cp ~/storage.conf fdfs_sh:/fdfs_conf/
    1
    创建一个txt文件

    [root@localhost 00]# docker exec -it fdfs_sh bash
    root@localhost:/# echo hello>a.txt
    1
    2
    进入fdfs_conf目录,并将文件上传到storage容器

    root@localhost:/# cd fdfs_conf
    root@localhost:/fdfs_conf# fdfs_upload_file storage.conf /a.txt
    1
    2
    /a.txt:指要上传的文件


    上传之后,根据返回的路径去找a.txt


    退出去查看上传的txt文件

    [root@localhost ~]# cd ~/store_path/data/00/00
    [root@localhost 00]# ls
    1
    2

    查看是否和输入的值是否相同

    [root@localhost 00]# more wKhzg1wGsieAL-3RAAAABncc3SA337.txt
    1


    java代码上传文件演示

    参考网址:https://github.com/luhuiguo/fastdfs-client
    1.创建模块 SPRINGCLOUD_FASTDFS

    2.加入依赖

    <!-- 下载jar包的私人仓库 -->
    <repositories>
    <repository>
    <id>sn</id>
    <name>sn</name>
    <url>https://oss.sonatype.org/content/repositories/releases/</url>
    </repository>
    </repositories>

    <dependencies>
    <!-- 集成mysql -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- 集成springmvc -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 连接fastdfs文件系统 -->
    <dependency>
    <groupId>com.luhuiguo</groupId>
    <artifactId>fastdfs-spring-boot-starter</artifactId>
    <version>0.2.0</version>
    </dependency>
    </dependencies>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    3.添加资源文件 application.yml

    server:
    port: 8899
    fdfs:
    # 连接Tracker服务器超时时间
    connect-timeout: 10000
    # storage服务器响应的超时时间
    so-timeout: 3000
    # trakcer服务器的数量
    tracker-list:
    - 192.168.115.131:22122
    spring:
    datasource:
    url: jdbc:mysql://localhost/m1dn
    password: ps123456
    username: root
    driver-class-name: com.mysql.jdbc.Driver
    # 上传文件的最大的大小
    http:
    multipart:
    max-file-size: 10000000
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    4.模拟一个文件上传
    1.上传(上传到storage服务的同时,拷贝一份数据到数据库里)
    upload.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <!--
    上传的方式是post
    enctype的格式必须是:multipart/form-data
    -->
    <form action="myUpload" method="post" enctype="multipart/form-data">
    文件:<input type="file" name="myFile">
    <input type="submit" value="上传">
    </form>
    </body>
    </html>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    创建一个UploadController.java (控制层)

    @RestController
    public class UploadController {

    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    JdbcTemplate jdbcTemplate;

    // MultipartFile是用来接收上传的文件
    // myFile的名字必须和上传的表单的名字一样
    @PostMapping("myUpload")
    public String upload(MultipartFile myFile) throws IOException {
    // myFile.getOriginalFilename():取到文件的名字
    // FilenameUtils.getExtension(""):取到一个文件的后缀名
    String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());

    // group1:指storage服务器的组名
    // myFile.getInputStream():指这个文件中的输入流
    // myFile.getSize():文件的大小
    // 这一行是通过storageClient将文件传到storage容器
    StorePath uploadFile = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);

    // 上传数据库
    String sql = "insert into file(filename,groupname,filepath) values(?,?,?)";
    jdbcTemplate.update(sql, myFile.getOriginalFilename(), uploadFile.getGroup(), uploadFile.getPath());

    // 返回它在storage容器的的路径
    return uploadFile.getFullPath();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    我的数据库

    浏览器上传文件

    点击上传后

    进入docker查看

    [root@localhost ~]# cd store_path/data/00/00
    1

    2.下载(根据数据库里面的id确定storage服务器中下载的文件)
    download.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <!-- 这里传数据库里的id -->
    <a href="fdownload/4">下载</a>
    </body>
    </html>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    控制层

    @GetMapping("/fdownload/{id}")
    public void download(@PathVariable String id, HttpServletResponse response) throws IOException {

    List query = jdbcTemplate.query("select * from file where fileid=" + id, new ColumnMapRowMapper());
    Map map = (Map) query.get(0);
    String filename = URLEncoder.encode(map.get("filename").toString(), "utf-8"); // 解决中文文件名下载后乱码的问题
    // 告诉浏览器 下载的文件名
    response.setHeader("Content-Disposition", "attachment; filename=" + filename + "");
    String groupName = map.get("groupName").toString();
    String filepath = map.get("filepath").toString();
    // 将文件的内容输出到浏览器 fastdfs
    byte[] downloadFile = storageClient.downloadFile(groupName, filepath);
    response.getOutputStream().write(downloadFile);
    }

  • 相关阅读:
    Element UI 安装报错:this dependency was not found:'element-ui/lib/theme-chalk/index.css'
    Xshell中用./startup.sh启动时候提示权限不够
    /bin/bash^M: 解释器错误: 没有那个文件或目录
    【ES从入门到实战】二十一、全文检索-ElasticSearch-分词-分词&安装ik分词
    ES(Elasticsearch)核心概念
    ES简介
    Linux给用户赋予某个文件夹的操作权限
    Qt QThread 这是我 见过解析最全面的一片文章
    QTcpServer使用多线程处理连接进来的QTcpSocket
    VS2019控制台输出中文乱码问题已解决
  • 原文地址:https://www.cnblogs.com/wangsongbai/p/15057693.html
Copyright © 2011-2022 走看看