FastDFS分布式文件存储系统

FastDFS 介绍
1). 为什么图片不存在服务器本地 , 而要存储在FastDFS这个分布式文件系统中 ?
在这里插入图片描述

2). FastDFS架构
FastDFS 是一个分布式文件系统 (阿里巴巴) ;
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存 储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的 问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

在这里插入图片描述

两个角色:
Tracker : 集群管理 , 中央调度 ;

Storage : 存储

1.2 FastDFS上传流程

在这里插入图片描述
1.3 FastDFS 安装
1). 如果使用的是提供的虚拟机 , FastDFS 镜像/容器都已经部署好了, 我们不需要执行任何操作 ;

2). 如果不是使用的提供的虚拟机 , 就需要根据笔记中提供的创建容器的步骤, 一步步的操作 ;
1.4 文件系统微服务搭建
1). pom.xml


org.springframework.boot
spring-boot-starter-web

net.oschina.zcx7878 fastdfs-client-java 1.27.0.0 com.changgou changgou_common 1.0-SNAPSHOT

2). application.yml
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
server:
port: 9008
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true

3). fdfs_client.conf
connect_timeout = 60
network_timeout = 60
charset = UTF-8
http.tracker_http_port = 8080
tracker_server = 192.168.200.128:22122

4). 引导类
@SpringBootApplication
@EnableEurekaClient
public class FileApplication {

public static void main(String[] args) {
SpringApplication.run(FileApplication.class,args);
}
}

1.5 FastDFS客户端API操作
1). 上传文件

@Test
public void testUploadFile() throws Exception {
   
   //1. 加载fastDFS配置文件
   ClientGlobal.init("D:\\changgou_parent\\changgou_service_file\\src\\main\\resources\\fdfs_client.conf");
​
   //2. 创建TrackerClient
   TrackerClient trackerClient = new TrackerClient();
​
   //3. 获取TrackerServer
   TrackerServer trackerServer = trackerClient.getConnection();
​
   //4. 创建StorageServer
   StorageServer storageServer = null;
​
   //5. 构建StorageClient
   StorageClient storageClient = new StorageClient(trackerServer, storageServer);
​
   //6. 文件上传
   String[] strings = storageClient.upload_file("D:/1.jpg", "jpg", null);
​
   for (String string : strings) {
  System.out.println(string);
  }
}

测试

http://192.168.192.152:8080/group1/M00/00/00/wKjAmF5DYriATi_fAAIz-JD1R5o225.jpg

2). 下载文件

byte[] bytes = storageClient.download_file("group1", "M00/00/00/wKjAmF5DYriATi_fAAIz-JD1R5o225.jpg");
​
FileOutputStream out = new FileOutputStream(new File("D:/001.jpg"));
​
out.write(bytes);
​
out.close();

3). 删除文件

int deleteFile = storageClient.delete_file("group1", "M00/00/00/wKjAmF5DYriATi_fAAIz-JD1R5o225.jpg");
​
System.out.println(deleteFile);

1.6 文件上传接口开发
用到的知识 :
1). SpringMVC中的文件上传 ;

SpringMVC 如何接收上传的文件 -------------> MultipartFile


2). FastDFS 中的API ;
代码实现 :

@RestController
@RequestMapping("/file")
public class FileController {
    /**
     * 文件上传
     * 文件上传必须为post请求
     * @param file file必须和页面请求的名称一致
     * @return 返回文件上传的结果
     */
    @PostMapping("/upload")
    public Result uploadFile(MultipartFile file){
        // 1.代码用try catch包裹,防止给用户响应错误的提示
        try {
            // 2.1进行非空校验,如果文件为null。则返回错误提示
            if (file == null){
                throw new RuntimeException("文件不存在");
            }

            // 2.2进行非空校验,如果上传的文件名称为空,则文件不存在 ,获取文件的完整的名称
            String originalFilename = file.getOriginalFilename();
            // 2.3判断如果文件名是不是空的 如果是空的返回文件不存在
            if (StringUtils.isEmpty(originalFilename)){
                throw new RuntimeException("文件不存在");
            }

            // 3.如果文件存在,构建fastDFSFile对象
            // 获取文件名称String name, 文件内容byte[] content, 文件的后缀名String ext
            // 3.1获取文件内容
            byte[] content = file.getBytes();

            // 3.2已经获取了文件的全名称。进行截取获取文件的后缀名
            String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);

            // 4.构建fastDFSFile对象
            FastDFSFile fastDFSFile = new FastDFSFile(originalFilename,content,ext);

            // 5.调用工具类进行上传
            String[] strings = FastDFSClient.upload(fastDFSFile);

            // 6.封装返回的结果 拼接url
            String url = FastDFSClient.getTrackerUrl() + strings[0] + "/" + strings[1];
            return new Result(true,StatusCode.OK,"文件上传成功",url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new Result(false, StatusCode.ERROR,"文件上传失败");
    }
}

在这里插入图片描述

发布了92 篇原创文章 · 获赞 3 · 访问量 2803

猜你喜欢

转载自blog.csdn.net/weixin_44993313/article/details/104286486