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博客搜索:标题关键字。以获取全部资料 ❤