springboot 集成FastDFS

本文详细介绍了如何在SpringBoot项目中集成FastDFS文件系统,包括添加fast-client依赖、配置类设置、FastDFSUtil工具类的编写以及API接口的实现,实现了文件的上传、删除和下载功能。
摘要由CSDN通过智能技术生成

上一篇文章:Centos7搭建FastDFS文件服务器,这里已经介绍了FastDFS文件服务器如何搭建,这篇文章介绍一下如何使用springboot集成FastDFS

1、添加fast-client依赖

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.27.2</version>
</dependency>

添加依赖后发现client依赖中自带了一个配置类FdfsClientConfig此配置类如下图所示:
在这里插入图片描述
如图所示,我们只需要使用@Import注解引入此文件即可,或者使用@ComponentScan注解扫描这个包也开始引入此配置类

2、添加配置类

package com.learn.admin.config;

import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @author LD
 * @date 2021/6/5 12:33
 */
@Configuration
@Import(FdfsClientConfig.class)
public class FastDFSConfig {
}

3、配置文件

fdfs:
  so-timeout: 1000
  connect-timeout: 1000
  tracker-list:
  	# 这里配置tracker的地址和端口号
    - 172.28.200.85:22122
   # - 192.168.0.103:22122
  pool:
    max-total: 50 #连接池最大连接数50
    test-while-idle: true
    block-when-exhausted: true #当缓存池耗尽是否阻塞,默认为true  false直接报异常,true阻塞直到超时
    max-wait-millis: 1000 #连接耗尽最大等待时间 毫秒,超时抛出异常
    min-evictable-idle-time-millis: 18000 #休眠时间超过该值则视为过期时间
    time-between-eviction-runs-millis: 6000 #60秒进行一次后台清理
    num-tests-per-eviction-run: -1 #清理时检查所有线程
    

4、FastDFSUtil工具类

package com.learn.admin.utils;

import com.github.tobato.fastdfs.domain.fdfs.MetaData;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;

/**
 * @author LD
 * @date 2021/6/5 12:35
 */
@Slf4j
@Component
public class FastDFSClientUtil {

    public static final String FILENAME = "filename";
    public static final String EXTENSION = "extension";

    private static final String DEFAULT_GROUP = "group1";
	
	@Autowired
    private FastFileStorageClient storageClient;

    public String uploadFile(MultipartFile file) throws IOException {
        HashSet<MetaData> metaData = Sets.newHashSet(new MetaData(FILENAME, file.getOriginalFilename()),
                new MetaData(EXTENSION, FilenameUtils.getExtension(file.getOriginalFilename())));
        return uploadFileAndMetaData(file, metaData);
    }

    public String uploadFileAndMetaData(MultipartFile file, Set<MetaData> metaData) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), metaData);
        return storePath.getPath();
    }


    public void deleteFile(String path) {
        if (!path.startsWith(DEFAULT_GROUP)) {
            path = DEFAULT_GROUP + File.separator + path;
        }
        storageClient.deleteFile(path);
    }

    public InputStream download(String path) {
        return download(DEFAULT_GROUP, path);
    }

    public InputStream download(String groupName, String path) {
        return storageClient.downloadFile(groupName, path, ins -> ins);
    }

    public Set<MetaData> getMetaData(String path) {
        return getMetaData(DEFAULT_GROUP, path);
    }

    public Set<MetaData> getMetaData(String groupName, String path) {
        return storageClient.getMetadata(groupName, path);
    }
}

5、API接口

package com.learn.admin.controller;

import cn.hutool.core.io.IoUtil;
import com.github.tobato.fastdfs.domain.fdfs.MetaData;
import com.learn.admin.utils.FastDFSClientUtil;
import com.learn.common.entity.Result;
import com.learn.security.anon.AnonymousAccess;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
import java.util.Set;

/**
 * @author LD
 * @date 2021/6/5 12:57
 */
@Slf4j
@RestController
@RequestMapping("/dfs")
public class FastDFSController {

	@Autowired
	private FastDFSClientUtil fastDFSClientUtil;

    @PostMapping("/upload")
    public Result<Object> uploadFile(MultipartFile file) throws IOException {
        return Result.data(fastDFSClientUtil.uploadFile(file));
    }

    @DeleteMapping("/delete")
    public Result<Object> deleteFile(String path) {
        fastDFSClientUtil.deleteFile(path);
        return Result.data(null);
    }

    @PostMapping("/download")
    public void downloadFile(String path, HttpServletResponse response) throws IOException {
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        Set<MetaData> metaData = fastDFSClientUtil.getMetaData(path);
        String filename = "";
        for (MetaData data : metaData) {
            if (Objects.equals(data.getName(), FastDFSClientUtil.FILENAME)) {
                filename = data.getValue();
                break;
            }
        }
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
        InputStream inputStream = FastDFSClientUtil.download(path);
        ServletOutputStream outputStream = response.getOutputStream();
        IoUtil.copy(inputStream, outputStream);
    }
}

### 回答1: Spring Boot集成FastDFS可以通过以下步骤实现: 1. 添加FastDFS依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.27.2</version> </dependency> ``` 2. 配置FastDFS连接信息 在application.properties文件中添加以下配置: ```properties # FastDFS配置 fdfs.tracker-list=192.168.1.100:22122,192.168.1.101:22122 fdfs.connect-timeout=500 fdfs.so-timeout=30000 fdfs.read-timeout=60000 ``` 其中,fdfs.tracker-list为FastDFS Tracker服务器列表,可以配置多个,用逗号分隔;fdfs.connect-timeout、fdfs.so-timeout、fdfs.read-timeout分别为连接、读取、写入超时时间。 3. 编写FastDFS文件上传代码 可以通过以下代码实现文件上传: ```java @Service public class FastDFSFileService { @Autowired private FastFileStorageClient fastFileStorageClient; public String uploadFile(MultipartFile file) throws IOException { StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null); return storePath.getFullPath(); } } ``` 其中,FastFileStorageClient是FastDFS提供的文件存储客户端,可以通过@Autowired注入使用;uploadFile方法用于上传文件,返回文件在FastDFS中的路径。 4. 编写FastDFS文件下载代码 可以通过以下代码实现文件下载: ```java @Service public class FastDFSFileService { @Autowired private DownloadByteArray callback; @Autowired private FastFileStorageClient fastFileStorageClient; public byte[] downloadFile(String filePath) { return fastFileStorageClient.downloadFile(filePath, callback); } } ``` 其中,DownloadByteArray是FastDFS提供的文件下载回调接口,可以通过@Autowired注入使用;downloadFile方法用于下载文件,返回文件的字节数组。 以上就是Spring Boot集成FastDFS的基本步骤,可以根据实际需求进行扩展和优化。 ### 回答2: FastDFS是一个开源的分布式文件系统,采用了多台服务器群来存储文件,并具有高可靠性、高扩展性和高性能的优点。而SpringBoot是一个快速构建企业级应用的开发框架,可以帮助开发者更加便捷地集成第三方库和框架。 在SpringBoot集成FastDFS,需要按照以下步骤进行操作: 1. 添加FastDFS的依赖 在pom.xml文件中,添加FastDFS的依赖: ```xml <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.27.1</version> </dependency> ``` 2. 配置FastDFS的连接信息 在application.properties(或application.yml)文件中,配置FastDFS的连接信息,如下: ```properties fdfs.tracker-list=192.168.1.100:22122,192.168.1.101:22122 ``` 3. 创建FastDFS的存储客户端 创建FastDFS的存储客户端,代码如下: ```java @Configuration public class FdfsClientConfig { @Bean public DefaultFastFileStorageClient storageClient() { TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getTrackerServer(); StorageServer storageServer = new StorageServer(trackerServer,null); return new DefaultFastFileStorageClient(trackerServer, storageServer); } } ``` 4. 使用FastDFS存储文件 在使用过程中,调用FastDFS的存储客户端,使用FastDFS存储文件。例如: ```java @Autowired private DefaultFastFileStorageClient storageClient; public String uploadFile(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null); return storePath.getFullPath(); } ``` 在以上代码中,首先注入FastDFS的存储客户端,然后调用其uploadFile方法,将文件存储到FastDFS中,并返回文件的路径。 通过以上四步,就可以在SpringBoot中成功集成FastDFS,并使用FastDFS来存储文件,以达到分布式存储和高可靠性的目的。 ### 回答3: SpringBoot是一个快速开发框架,能够快速开发各种类型的Java应用程序。FastDFS是一个轻量级的分布式文件系统,用于存储大文件。本文将介绍如何使用SpringBoot集成FastDFS。 一、搭建FastDFS环境 1. 安装libfastcommon $ tar zxvf libfastcommon-1.0.7.tar.gz $ cd libfastcommon-1.0.7 $ ./make.sh $ sudo ./make.sh install 2. 安装FastDFS $ tar zxvf FastDFS_v5.11.tar.gz $ cd FastDFS $ ./make.sh $ sudo ./make.sh install 3. 配置Tracker服务器 在/etc/fdfs目录下创建tracker.conf文件,内容如下: port=22122 base_path=/var/fdfs/tracker log_level=info run_by_group=fastdfs run_by_user=fastdfs 4. 配置Storage服务器 在/etc/fdfs目录下创建storage.conf,内容如下: # mount point /mnt/hdd1 /mnt/hdd2 #Base path for file storage base_path=/var/fdfs/storage #Store path for file storge store_path0=/mnt/hdd1 store_path1=/mnt/hdd2 #Storage tracker server tracker_server=192.168.1.1:22122 5. 启动FastDFS服务 在不同的服务器上分别启动Tracker和Storage服务。 $ sudo /etc/init.d/fdfs_trackerd start $ sudo /etc/init.d/fdfs_storaged start 检查服务是否已启动: $ ps aux | grep fdfs 二、SpringBoot集成FastDFS 1. 添加maven依赖 <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.25.2</version> </dependency> 2. 配置文件 spring: #fastdfs配置 tracker-list: 192.168.1.1:22122 3. 编写代码 使用FastDFS需要创建TrackerClient和StorageClient两个对象。 通过TrackerClient对象可以得到Storage服务器地址。 通过StorageClient对象上传文件和下载文件。 上传: StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), fileExtName, null); String fullPath = storePath.getFullPath(); 下载: byte[] bytes = storageClient.downloadFile(group, path); return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).contentLength(bytes.length).body(bytes); 通过以上步骤,即可快速集成FastDFSSpringBoot中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值