上一篇文章: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);
}
}