FastDFS介绍
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS服务端有两个角色
跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
安装FastDFS
拉取Docker
docker pull morunchang/fastdfs
启动tracker 跟踪器
docker run -d --name tracker --net=host -p 22122:22122 morunchang/fastdfs sh tracker.sh
启动storage 存储节点
docker run -d --name storage --net=host -e TRACKER_IP=192.168.10.10:22122 -e GROUP_NAME=group01 morunchang/fastdfs sh storage.sh
修改存储节点信息
docker exec -it 容器ID bash
vim storage.conf
SpringBoot整合FastDFS
我们采用github开源的Java fastdfs客户端:https://github.com/tobato/FastDFS_Client
引入Maven fastdfs-client仓库
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
添加配置文件
# 读取时间
fdfs.so-timeout=2000
# 连接超时时间
fdfs.connect-timeout=5000
# 缩略图
fdfs.thumb-image.height=150
fdfs.thumb-image.width=150
# tracker地址
fdfs.tracker-list=192.168.10.10:22122
# store的nginx地址 注意后面要有/
fdfs.web-server-url=http://192.168.10.10:8080/
fdfs.pool.max-total=-1
代码展示
import com.github.tobato.fastdfs.domain.conn.FdfsWebServer;
import com.github.tobato.fastdfs.domain.fdfs.MetaData;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@RestController
@AllArgsConstructor
@RequestMapping("/fdfs")
@Slf4j
public class FastdfsController {
private final FastFileStorageClient fastFileStorageClient;
private final FdfsWebServer fdfsWebServer;
/**
* 上传文件
*/
@PostMapping("uploadFile")
public List<String> uploadFile(MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
// 获取文件扩展名
String extension = FilenameUtils.getExtension(fileName);
// 文件元数据信息
Set<MetaData> metaData = new HashSet<>(4);
metaData.add(new MetaData("fileName",fileName));
// 上传文件
StorePath storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), extension, metaData);
log.info("文件上传路径:[{}]",storePath.getFullPath());
String viewPath = fdfsWebServer.getWebServerUrl() + storePath.getFullPath();
log.info("可访问路径:[{}]",viewPath);
extension = FilenameUtils.getExtension(viewPath);
String xthumbPath = viewPath.replace("." + extension, "")+"_150x150."+extension;
log.info("缩略图路径:[{}]",xthumbPath);
List<String> result = new ArrayList<>(3);
result.add(viewPath);
result.add(xthumbPath);
result.add(storePath.getFullPath());
return result;
}
/**
* 下载文件
*/
@GetMapping("download")
public void downloadFile(String filePath, HttpServletResponse response) throws IOException {
log.info("需要下载的文件:[{}]",filePath);
String group = filePath.substring(0, filePath.indexOf("/"));
String path = filePath.substring(filePath.indexOf("/") + 1);
Set<MetaData> metadata = fastFileStorageClient.getMetadata(group, path);
String fileName = metadata.iterator().next().getValue();
byte[] bytes = fastFileStorageClient.downloadFile(group, path, new DownloadByteArray());
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, Charsets.UTF_8.displayName()));
IOUtils.write(bytes,response.getOutputStream());
}
/**
* 删除文件
*/
@PostMapping("delete")
public void deleteFile(String filePath) throws IOException {
log.info("需要删除的文件:[{}]",filePath);
//String group = filePath.substring(0, filePath.indexOf("/"));
String path = filePath.substring(filePath.indexOf("/") + 1);
fastFileStorageClient.deleteFile(path);
log.info("删除文件后,请查看是否能否访问,如果有缩略图,请主动再次删除缩略图");
}
}
测试
通过地址访问即可。删除也是可用的!
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤