FastDFS理论与Java程序的对接(图片,文件上传)

文章介绍了FastDFS是一个轻量级的开源分布式文件系统,用于存储和同步文件。在Java程序中对接FastDFS,涉及pom配置引入fastdfs-client依赖,Java启动类添加注解@Import(FdfsClientConfig.class)和@EnableMBeanExport,以及yaml文件配置连接超时、Tracker服务器地址等。Controller类处理文件上传和删除请求,Service类实现了文件上传和删除的具体逻辑,使用FastFileStorageClient进行文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fastdfs概述

什么是分布式文件系统?
是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机与节点相连。
通俗来讲:

  • 传统文件系统管理的文件就存储在本机
  • 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问。

FastDFs是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:

  • 文件存储·
  • 文件同步
  • 文件访问(上传、下载)。
  • 存取负载均衡。
  • 在线扩容

适合有大容量存储需求的应用或系统。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。

FastDFS两个主要的角色:TrackerServer和storage Server

  • Tracker Server:跟踪服务器,主要负责调度storage节点与cint通信,在访问上起负载均衡的作用,和记录storage节点的运行状态(监控),是连接client和storage节点的枢纽
  • Storage Server:存储服务器,保存文件和文件的metadata(元数据),每个storageserver会启动一个单独的线程主动向Tracker cluster中每个trackersever报告状态信息(心跳),包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
  • Group:文件组,多台storageServer的售群。上传一个文件到同组内的一台机器上后,FastDFs会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。
  • Tracker cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成
  • storage Cluster:存储集群,有多个Group组成

在这里插入图片描述

Java程序对接fastDFS

pom

 <!-- fastDFS分布式文件存储 -->
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.27.2</version>
        </dependency>

配置java启动类注解

@Import(FdfsClientConfig.class)---->加此注解就可以拥有带有连接池的Fastdfs java客户端了
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)------->为了解决JMX重复注册bean的问题

@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)

yaml文件配置

fdfs:
  so-timeout: 1501
  connect-timeout: 601
  thumb-image: # 缩略图
    width: 60
    height: 60
  tracker-list: # tracker地址
    - 192.168.103.100:22122
  view-base-url: http://192.168.103.100:8888 #网页应用配置服务器地址

controller类

@RestController
public class UploadController {

    @Autowired
    private UploadService uploadService;
    @PostMapping("/upload")
    public ImageResult create(@RequestBody MultipartFile file){
        return uploadService.create(file);
    }
    @DeleteMapping("/delete")
    public boolean delete(@RequestParam("url")String url){
        return uploadService.delete(url);
    }
}

service类

@Service
@Log4j2
public class UploadServiceImpl implements UploadService {
    //fastDFS客户端
    @Autowired
    FastFileStorageClient fastFileStorageClient;
    //读取缩略图
    @Autowired
    private ThumbImageConfig thumbImageConfig;
    @Value("${fdfs.view-base-url}")
    private String basePath;

    /**
     * 图片上传至fastfds上
     * @param file
     * @return
     */
    @Override
    public ImageResult create(MultipartFile file) {
        // 获取文件后缀名
        String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");

        //上传
        StorePath storePath = null;
        InputStream is =null;
        try {
//            upload上传(任意类型文件都可以)
            is=file.getInputStream();
            storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(is, file.getSize(), extension,null);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
//                 输入流必须关闭,否则无法删除tomcat下的临时文件
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        log.info("正常图片的路径:{}",storePath.getFullPath());
        log.info("缩略图片的路径:{}",thumbImageConfig.getThumbImagePath(storePath.getFullPath()));
        return new ImageResult()
                .setErrno(0)
                .setData(new Image()
                        .setUrl(basePath+"/"+storePath.getFullPath()));
    }
//图片删除
    @Override
    public boolean delete(String url) {
        try {
            fastFileStorageClient.deleteFile(url);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值