当先锋百科网

首页 1 2 3 4 5 6 7

FastDFS :是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。
参考:https://hub.docker.com/r/season/fastdfs/

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

Tracker Server: 跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

在这里插入图片描述
案例演示:

打开linux系统用docker下拉FastDFS 输入docker指令:

docker pull season/fastdfs

运行一个跟踪器服务器:

docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker

查看是否启动:

docker ps -a

如果未启动查看端口是否被占 跟踪器默认端口是22122 或者关闭防火墙 关闭防火墙后重启linux连接 重启后按下图操作:
在这里插入图片描述

运行一个存储服务器 (ip地址自行修改):

 docker run -ti -d --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.1.2:22122 season/fastdfs storage(TRACKER_SERVER:192.168.1.2)

》》测试文件上传 操作如下图:
在这里插入图片描述
改文件内容里的trakcer_server把对应的ip地址改成自己对应的ip再操作:
在这里插入图片描述

运行一个客户端:

docker run -ti --name fdfs_sh --net=host season/fastdfs sh

进入文件修改ip然后创建文件并且上传:
在这里插入图片描述

SpringBoot集成FastDFS

pom文件引入依赖:

<repositories>
        <repository>
            <id>sn</id>
            <name>sn</name>
            <url>https://oss.sonatype.org/content/repositories/releases/</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>fastdfs-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
    </dependencies>

控制层controller:

@RestController
public class UploadController {

    @Autowired
    private FastFileStorageClient storageClient;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    /**
     *
     * @param myFile 是从浏览器提交过来 s
     * @return
     * @throws IOException
     */

    @PostMapping("fupload")//上传
    public String upload(@RequestParam("myFile") MultipartFile myFile) throws IOException {
        String extName= FilenameUtils.getExtension(myFile.getOriginalFilename());
        StorePath storePath = storageClient.uploadFile("group1",myFile.getInputStream(),myFile.getSize(),extName);
        String sql="insert into Myfile(fileName,groupName,filePath) values(?,?,?)";
        jdbcTemplate.update(sql,myFile.getOriginalFilename(),storePath.getGroup(),storePath.getPath());
        return storePath.getFullPath();
    }
    @GetMapping("/fdownload/{id}")// 下载
    public void download(@PathVariable String id, HttpServletResponse httpServletResponse) throws IOException {

        List query = jdbcTemplate.query("select * from myfile where fileId="+id, new ColumnMapRowMapper());
        Map map= (Map) query.get(0);
        String fileName=map.get("fileName").toString();
        String groupName=map.get("groupName").toString();
        String filePath=map.get("filePath").toString();
        httpServletResponse.setHeader("Content-Disposition","attachment; filename="+fileName+"");
        byte[] bytes = storageClient.downloadFile(groupName, filePath);
        httpServletResponse.getOutputStream().write(bytes);
    }

}

静态页面 html:
上传:

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

下载:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/fdownload/1">下载</a>
</body>
</html>

application.yml 配置文件:

server:
#端口
  port: 8877  
fdfs:
#连接超时时间
  connect-timeout: 10000
  so-timeout: 3000
  #跟踪服务器的ip和端口
  tracker-list:
    - 192.168.67.128:22122
spring:
#数据库连接
  datasource:
    url: jdbc:mysql://localhost/unit02
    password: ps123456
    username: root
    driver-class-name: com.mysql.jdbc.Driver
  http:
    multipart:
      max-file-size: 10485760

main方法运行:

@SpringBootApplication
public class Filemain {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Filemain.class).web(true).run(args);

    }
}

上传文件:
在这里插入图片描述
上传成功后页面展示:
在这里插入图片描述