FastDFS整合SpringBoot

橙三吉。 提交于 2020-11-25 06:43:37

FastDFS整合SpringBoot

搭建好fastDFS后当然就是要开始整合到项目中使用,这里使用FastDFS-ClientSpringBoot整合。 如果查看分布式文件系统原理服务器搭建,可以点击查看。

工具

jdk SpringBoot FastDFS-Client maven FastDFS
11 2.2.2 1.27.1 3.6.3 6.06

FastDFS-Client

介绍: 在原作者YuQing与yuqih发布的java客户端基础上进行了大量重构工作,便于Java工作者学习与阅读。

主要特性:

  • 对关键部分代码加入了单元测试,便于理解与服务端的接口交易,提高接口质量
  • 将以前对byte硬解析风格重构为使用 对象+注解 的形式,尽量增强了代码的可读性
  • 支持对服务端的连接池管理(commons-pool2)
  • 支持上传图片时候检查图片格式,并且自动生成缩略图
  • 在SpringBoot当中自动导入依赖

其他的可以看github介绍FastDFS-Client

整合开始

创建SpringBoot项目 创建 依赖包:

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

jdk11可能会缺失一些包,需要导入Commons里包。但是jdk'8应该不用。

配置文件:

server:
  port: 8888

### fdfs配置
fdfs:
  so-timeout: 1501
  connect-timeout: 601
  thumb-image:
    width: 150
    height: 150
  tracker-list:
    # 可写多个tracker-server地址
    - 192.168.xxx.xxx:22122

Application编辑

import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;

@SpringBootApplication
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastdfsFileApplication {

    public static void main(String[] args) {
        SpringApplication.run(FastdfsFileApplication.class, args);
    }

}

单元测试:

@SpringBootTest
class FastdfsFileApplicationTests {

    private final static Logger log = LoggerFactory.getLogger(FastdfsFileApplicationTests.class);

    @Resource
    private FastFileStorageClient fastFileStorageClient;
    @Resource
    private ThumbImageConfig thumbImageConfig;

    /**
     * 上传测试
     */
    @Test
    void testUpload() throws FileNotFoundException {
        var path = "图片的路径";
        var image = new File(path);
        // 上传图片
        var fastJpg = fastFileStorageClient.uploadFile(new FileInputStream(image),
                image.length(), "jpg", null);
        // 带分组的路径
        log.info(fastJpg.getFullPath());
        // 不带分组的路径
        log.warn(fastJpg.getPath());
    }

    /**
     * 测试删除相片
     */
    @Test
    void delImag(){
        fastFileStorageClient.deleteFile("http://192.168.247.201/group1/M00/00/00/wKj3yV4u5cCAarJ1AA2CBRqtFgE245.jpg");
        log.warn("ok");
    }

    /**
     * 测试上传缩略图
     */
    @Test
    void testThumbImage() throws FileNotFoundException {
        var path = "E:\\idea\\ServiceCode\\fastdfs-file\\src\\main\\resources\\static\\img\\upload.jpg";
        var image = new File(path);
        var thumbImage = fastFileStorageClient.uploadImageAndCrtThumbImage(new FileInputStream(image), image.length(), "jpg", null);
        log.info("缩略图路径:" + thumbImageConfig.getThumbImagePath(thumbImage.getPath()));
        log.warn("图片全路径:" + thumbImage.getFullPath());
        log.debug("图片分组:" + thumbImage.getGroup());
        log.error("打印信息:" + thumbImage.toString());
    }

    /**
     * 文件信息
     */
    @Test
    public void testFileInfo(){
        String uri = "http://192.168.247.201/group1/M00/00/00/wKj3yV4xQOSAPoyQAAzn60z3Hss404.jpg";
        var filePath = uri.substring(uri.indexOf("group"));
        var group = filePath.substring(0, filePath.indexOf("/"));
        var path = filePath.substring(filePath.indexOf("/")+1);
        log.warn("group:"+group+"<-->path:"+path);
        var fileInfo = fastFileStorageClient.queryFileInfo(group,path);
        log.info(fileInfo.toString());
    }
}

由此可以自定义工具类


import com.github.tobato.fastdfs.domain.fdfs.ThumbImageConfig;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.IOException;

/**
 * @author 佐斯特勒
 * <p>
 *  FastDFS包装类
 *  用来包装操作FastDFSClient
 * </p>
 * @version v1.0.0
 * @date 2020/1/28 1:14
 * @see  FastDFSWrapper
 **/
@Component
@Slf4j
public class FastDFSWrapper {
    @Resource
    private FastFileStorageClient fastFileStorageClient;
    @Resource
    private ThumbImageConfig thumbImageConfig;
    /**
     * 文件上传
     * 最后返回fastDFS中的文件名称;group1/M00/01/04/CgMKrVvS0geAQ0pzAACAAJxmBeM793.doc
     *
     * @param bytes     文件字节
     * @param fileSize  文件大小
     * @param extension 文件扩展名
     * @return fastDfs路径
     */
    public String uploadFile(byte[] bytes, long fileSize, String extension) {
        var byteArrayInputStream = new ByteArrayInputStream(bytes);
        var storePath = fastFileStorageClient.uploadFile(byteArrayInputStream, fileSize, extension, null);
        log.info(storePath.getGroup() + "==" + storePath.getPath() + "======" + storePath.getFullPath());
        return storePath.getFullPath();
    }

    /**
     * 文件上传 原图+150x150缩略图
     * @param bytes     文件字节
     * @param fileSize  文件大小
     * @param extension 文件扩展名
     * @return fastDfs路径
     */
    public String[] uploadThumbFile(byte[] bytes, long fileSize, String extension) {
        var byteArrayInputStream = new ByteArrayInputStream(bytes);
        var storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(byteArrayInputStream, fileSize, extension, null);
        log.info(storePath.getGroup() + "==" + thumbImageConfig.getThumbImagePath(storePath.getPath()) + "======" + storePath.getFullPath());
        return new String[]{thumbImageConfig.getThumbImagePath(storePath.getFullPath()), storePath.getFullPath()};
    }

    /**
     * 下载文件
     *  返回文件字节流大小
     * @param fileUrl 文件URL
     * @return 文件字节
     * @throws IOException .
     */
    public byte[] downloadFile(String fileUrl) throws IOException {
        fileUrl = fileUrl.substring(fileUrl.indexOf("group"));
        var group = fileUrl.substring(0, fileUrl.indexOf("/"));
        var path = fileUrl.substring(fileUrl.indexOf("/") + 1);
        var downloadByteArray = new DownloadByteArray();
        log.info("group:"+group+"--path:"+path);
        return fastFileStorageClient.downloadFile(group, path, downloadByteArray);
    }

    /**
     * 删除图片
     * @param fileUrl 文件地址
     */
    public void delFile(String fileUrl){
        fastFileStorageClient.deleteFile(fileUrl);
    }
}

大家可以参照上面的工具类来制作文件处理。更多的案例可以看FastDFS-Client作者的test/serviceFastDFS-Client源码

下面是我做的下案例

有上传图片和上传图片显示原图与缩略图的功能,还有下载图片功能 上传案例 案例地址:gitee地址 觉得好别忘了点个赞(✪ω✪)(✪ω✪)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!