FastDFS分布式文件系统

本文详细介绍FastDFS分布式文件系统的概念、安装配置及代码实现,包括如何在Docker环境下搭建FastDFS集群,以及Spring Boot应用集成FastDFS进行文件上传与下载的全过程。

FastDFS概念

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS概念图

在这里插入图片描述

在Linux虚拟机docker容器上面下载FastDFS Linux操作:

docker pull season/fastdfs
启动tracker容器

默认端口为:22122

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

提示:一定要关防火墙

vi /etc/sysconfig/selinux

进入之后修改SELINUX的值

SELINUX=disabled

然后重启:
reboot

启动storager容器
docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.119.132:22122 season/fastdfs storage

进入storager容器 修改注册中心ip
吧文件cp到本地根目录下修改

docker cp storage:/fdfs_conf/storage.conf ~/

然后再cp到storage:/fdfs_conf/目录下

开一个客户端 敲运行命令

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

测试文件上传
查看/usr/bin下的所有fdfs工具

fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file

上传路径为
group1/M00/00/00/wKh3hFwGc7-AH5ShAAAAB6Dv-8U004.txt

代码实现

依赖

  <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>
    </dependencies>

如果没有fastdfs-spring-boot-starter这个依赖加sonatype私服

<repositories>
        <repository>
            <id>sn</id>
            <name>sn</name>
            <url>https://oss.sonatype.org/content/repositories/releases/</url>
        </repository>
    </repositories>

配置文件

server:
  port: 8899//端口
fdfs:
  connect-timeout: 10000 //最大连接超时
  so-timeout: 3000 //最大响应超时
  tracker-list:
    - 192.168.119.132:22122 //Tracker服务器端口
spring:
  datasource:
    url: jdbc:mysql://localhost/tang //数据库url
    password: ps123456	//数据库用户密码
    username: root	//数据库用户
    driver-class-name: com.mysql.jdbc.Driver//驱动程序类名
  http:
    multipart:
      max-file-size: 10485760 //上传最大文件大小

代码实现

@RestController
public class UploadController {
    @Autowired
    private FastFileStorageClient storageClient;
    @Autowired
    JdbcTemplate jdbcTemplate;
	/**
     *
     * @param myFile
     * 是从浏览器提交过来的
     * @return
     * @throws IOException
     */
    @PostMapping("fupload")//上传文件
    public String upload(@RequestParam("myFile1") MultipartFile myFile) throws IOException {
        String extName= FilenameUtils.getExtension(myFile.getOriginalFilename());
        StorePath storePath = storageClient.uploadFile("group1",myFile.getInputStream(),myFile.getSize(),extName);
        String sql="insert into myflie(filename,qroupName,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 myflie where fileid="+id, new ColumnMapRowMapper());
        Map map= (Map) query.get(0);
        String filrName=map.get("filename").toString();
        String groupName=map.get("qroupName").toString();
        String filePath=map.get("filepath").toString();
        httpServletResponse.setHeader("Content-Disposition","attachment; filename="+filrName+"");
        byte[] bytes = storageClient.downloadFile(groupName, filePath);
        httpServletResponse.getOutputStream().write(bytes);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值