Docker搭建FastDFS

目录

1. 单机配置
   1.1 端口放行
   1.2 跟踪服务器
   1.3 存储服务器
   1.4 测试
   1.5 文件上传(SpringBoot实现)




1. 单机配置(delron/fastdfs)


环境
阿里云服务器 CentOS 7
Docker version 20.10.12

(1)端口放行
# 如果防火墙服务打开的,需要端口放行
firewall-cmd --add-port=22122/tcp --zone=public --permanent
firewall-cmd --add-port=23000/tcp --zone=public --permanent
firewall-cmd --add-port=9001-9010/tcp --zone=public --permanent
# 重新加载
firewall-cmd --reload
# 云服务器需要将以上端口加入安全组

(2)跟踪服务器
# 拉取镜像
docker pull delron/fastdfs

# 跟踪服务器
# tracker_server=本机ip:22122  http.server.port=8080
docker run -it -d --name tracker \
-v /home/data/tracker:/var/fdfs \
-p 22122:22122 \
-p 9001:8080 \
delron/fastdfs tracker

(3)存储服务器
# the storage server port=23000
# the port of the web server on this storage server=8888
docker run -itd --name storage \
-v /home/data/fdfs/storage:/var/fdfs/ \
-e TRACKER_SERVER=120.37.100.249:22122 \
-e GROUP_NAME=group1 \
-p 23000:23000 \
-p 9002:8888 \
delron/fastdfs storage


(4)测试
docker exec -it storage /bin/bash

# 测试文件
echo "hello" > /a.txt
# 文件上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /a.txt

在这里插入图片描述

# 退出容器查看
exit
# /home/data/fdfs/storage为之前配置的路径,上述路径的group1/M00替换为data
cat /home/data/fdfs/storage/data/00/00/rBEABmJRpTaAEYovAAAABncc3SA653.txt

在这里插入图片描述



(5)文件上传(SpringBoot实现)

项目结构
在这里插入图片描述

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- fastdfs-spring-boot-starter -->
    <dependency>
        <groupId>com.luhuiguo</groupId>
        <artifactId>fastdfs-spring-boot-starter</artifactId>
        <version>0.2.0</version>
    </dependency>
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.2</version>
    </dependency>
    <!-- druid数据库连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.8</version>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

application.yml

# 应用名称
spring:
  application:
    name: FastDFS
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://120.37.100.249:3306/fastdfs?useSSL=false&serverTimezone=UTC
      username: root
      password: password
# 应用服务 WEB 访问端口
server:
  port: 8080


fdfs:
  connect-timeout: 10000
  so-timeout: 3000
  tracker-list:
    - 120.37.100.249:22122

my_file.sql

# database fastdfs
drop table if exists `my_file`;

create table `my_file`
(
    `id`        int(8) not null auto_increment,
    `fileName`  varchar(50),
    `groupName` varchar(50),
    `filePath`  varchar(50),
    primary key (`id`)
);

select * from my_file;

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>upload</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
        <strong>文件:</strong><input type="file" name="myFile"><br/><br/>
        <input type="submit" value="上传">
    </form>
    <br/><br/>
    <a href="download/1">下载第一个文件</a>
</body>
</html>

MyFile

@Data
@Alias("my_file")
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class MyFile {
    private Integer fileId;
    private String fileName;
    private String groupName;
    private String filePath;
}

MyFileMapper

@Mapper
public interface MyFileMapper {
    /**
     * 添加文件
     * @param myFile file
     */
    @Insert("insert into my_file (fileName, groupName, filePath) values (#{fileName}, #{groupName}, #{filePath})")
    void insert(MyFile myFile);

    /**
     * 根据id查询
     * @param id id
     * @return MyFile
     */
    @Select("select * from my_file where id=#{id}")
    MyFile query(Integer id);
}

UploadController

@RestController
public class UploadController {

    @Autowired
    private FastFileStorageClient storageClient;
    @Autowired
    private MyFileMapper myFileMapper;

    @PostMapping("/upload")
    public String upload(@RequestParam("myFile") MultipartFile myFile) throws IOException {
        // 获取文件后缀名
        String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());
        StorePath storePath = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);
        MyFile uploadFile = new MyFile()
                .setFileName(myFile.getOriginalFilename())
                .setGroupName(storePath.getGroup())
                .setFilePath(storePath.getPath());
        myFileMapper.insert(uploadFile);
        return storePath.getFullPath();
    }

    @GetMapping("/download/{id}")
    public void download(@PathVariable String id, HttpServletResponse response) throws IOException {
        MyFile file = myFileMapper.query(Integer.parseInt(id.trim()));
        response.setHeader("Content-Disposition", "attachment; filename=" + file.getFileName());
        byte[] bytes = storageClient.downloadFile(file.getGroupName(), file.getFilePath());
        response.getOutputStream().write(bytes);
    }
}

http://localhost:8080/


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值