FastDFS-02-JavaAPI

我是码赛客1024,本节我们来使用java调用FastDFS进行文件上传等操作。

一、介绍

在上一章节,咱们搭建好了fastdfs服务器,并实现了基于命令的上传测试和web访问。本节,咱们使用Java来调用API实现上传文件到FastDFS。

二、fastdfs-client-java客户端

2.1 准备fastdfs-client-java的包

fastdfs-client-java 是fastdfs官方提供的客户端,但是该jar包在maven仓库中没有,需要我们手动安装到本地库后才能导入使用。

① 下载源码,地址:https://github.com/happyfish100/fastdfs-client-java
或者qq群(1109193029)中下载,github下载会比较慢。
在这里插入图片描述
② 解压,并使用cmd进入目录
FastDFS-02-JavaAPI_第1张图片

③ 编译:mvn clean install
FastDFS-02-JavaAPI_第2张图片

④ 安装成功
FastDFS-02-JavaAPI_第3张图片
⑤ 使用如下坐标,导入项目即可

<dependency>
    <groupId>org.csourcegroupId>
    <artifactId>fastdfs-client-javaartifactId>
    <version>1.29-SNAPSHOTversion>
dependency>

2.2 创建SpringBoot项目

2.2.1 相关依赖

pom.xml

<parent>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-parentartifactId>
    <version>2.6.10version>
    <relativePath/> 
parent>
...
<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    <dependency>
        <groupId>org.csourcegroupId>
        <artifactId>fastdfs-client-javaartifactId>
        <version>1.29-SNAPSHOTversion>
    dependency>
dependencies>

application.yml

spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 5MB      # 上传文件单个限制

2.2.2 准备页面

resources\static\upload.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件title>
head>
<body>
    <form id="fileForm" action="/upload" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="file"> <br>
        <input type="submit" value="上传">
    form>
body>
html>

2.2.2 准备controller

@RestController
public class FileController {
    @RequestMapping("/upload")
    public Map<String,Object> uploadFile(MultipartFile file){
        //1.调用fastdfs-client-java实现上传

        //2.返回结果
        Map<String,Object> map = new HashMap<>();
        map.put("path","文件路径");
        return map;
    }
}

2.3 上传案例

① 准备fastdfs配置文件
resources\fdfs_client.conf

tracker_server=192.168.229.4:22122  #tracker的地址

application.yml中增加自定义配置,因为我的fastdfs运行在192.168.229.4这台服务器上,nginx也是配置在里边的。

base:
  file:
    url: http://192.168.229.4:8888/

② 实现上传

@RestController
public class FileController {

    @Value("${base.file.url}") //获取yml中的路径
    private String BASE_FILE_URL;

    @RequestMapping("/upload")
    public Map<String,Object> uploadFile(MultipartFile file){
        Map<String,Object> map = new HashMap<>();
        try {
            //1.调用fastdfs-client-java实现上传
            //1.1 加载配置文件
            ClientGlobal.init("fdfs_client.conf");
            //1.2 创建TrackerClient对象
            TrackerClient tracker = new TrackerClient();
            //并获取TrackerServer对象
            TrackerServer trackerServer = tracker.getTrackerServer();
            //1.3 创建StorageClient
            StorageClient storageClient = new StorageClient(trackerServer);
            //1.4 上传文件
            //获取文件后缀名
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            //执行上传:参数1:文件的字节数组,参数2:文件的后缀名,参数3:文件的元数据
            String[] resultArr = storageClient.upload_file(file.getBytes(), suffix, null);
            String groupName = resultArr[0]+"/"; //组名
            String filePath = resultArr[1];      //文件路径
            //2.返回结果
            map.put("path",BASE_FILE_URL+groupName+filePath);
            map.put("msg","上传成功");
        }catch (Exception e){
            e.printStackTrace();
            map.put("msg","上传失败");
        }
        return map;
    }
}

③ 上传后的效果展示,基于path就可以访问到图片
在这里插入图片描述

2.4 删除案例

这里就不写页面了,直接基于main进行测试。

public class MyTest{
	 public static void main(String[] args) {
        try {
            //1、加载配置文件
            ClientGlobal.init("fdfs_client.conf");
            //2、创建TrackerClient对象
            TrackerClient tracker = new TrackerClient();
            //并获取TrackerServer对象
            TrackerServer trackerServer = tracker.getTrackerServer();
            //3、创建StorageClient
            StorageClient storageClient = new StorageClient(trackerServer);
            //4、删除文件, 参数1:组名,参数2:文件路径
            int delete = storageClient.delete_file("group1", "M00/00/00/wKjlBGNsjNiAZlIoAACs7ev0sfI039.png");
            System.out.println(delete==0?"删除成功":"删除失败");
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

2.5 下载案例

public class MyTest{
	 public static void main(String[] args) {
        try {
            //1、加载配置文件
            ClientGlobal.init("fdfs_client.conf");
            //2、创建TrackerClient对象
            TrackerClient tracker = new TrackerClient();
            //并获取TrackerServer对象
            TrackerServer trackerServer = tracker.getTrackerServer();
            //3、创建StorageClient
            StorageClient storageClient = new StorageClient(trackerServer);
            //4、下载文件(字节数组), 参数1:组名,参数2:文件路径
            byte[] fileData = storageClient.download_file("group1", "M00/00/00/wKjlBGNsi1aAfvPtAAE3u81sxQY134.png");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

三、fastdfs-client客户端

3.1 说明

fastdfs-client客户端是基于官方api进行的再次封装,方便调用,并且在springboot中集成也非常方便。

地址:https://github.com/tobato/FastDFS_Client

主要特性

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

3.2 使用fastdfs-client

3.2.1 导包

<dependency>
    <groupId>com.github.tobatogroupId>
    <artifactId>fastdfs-clientartifactId>
    <version>1.27.2version>
dependency>

3.2.2 配置文件

# ===================================================================
# 分布式文件系统FDFS配置开始
# ===================================================================
fdfs:
  so-timeout: 1500         #读取时间
  connect-timeout: 600     #连接超时时间
  thumb-image:             #缩略图生成参数
    width: 150
    height: 150
  tracker-list:            #TrackerServer列表,支持多个
    - 192.168.229.4:22122
  pool:
    #从池中借出的对象的最大数目(配置为-1表示不限制)
    max-total: -1
    #获取连接时的最大等待毫秒数(默认配置为5秒)
    max-wait-millis: 5000
    #每个key最大连接数
    max-total-per-key: 50
    #每个key对应的连接池最大空闲连接数
    max-idle-per-key: 10
    #每个key对应的连接池最小空闲连接数
    min-idle-per-key: 5
# ===================================================================
# 分布式文件系统FDFS配置结束
# ===================================================================

spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 5MB      # 上传文件单个限制

base:
  file:
    url: http://192.168.229.4:8888/

3.2.3 上传文件

@RestController
public class FileController {

    @Value("${base.file.url}") //获取yml中的路径
    private String BASE_FILE_URL;

    @Autowired //注入fastdfs-client客户端
    private FastFileStorageClient fastFileStorageClient;

    @RequestMapping("/upload")
    public Map<String,Object> uploadFile(MultipartFile file){
        Map<String,Object> map = new HashMap<>();
        try {
            //获取文件后缀
            String originalFilename = file.getOriginalFilename();
            String fileExtName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            //1.上传文件
            //参数1: 文件输入流
            //参数2: 文件大小
            //参数3: 文件后缀
            //参数4: 元数据
            StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), fileExtName, null);
            //2.获取上传后的文件路径。例如:group1/M00/00/00/wKjlBGNsoFmAcyzjAACs7ev0sfI188.png
            String fullPath = storePath.getFullPath();
            //3.返回结果
            map.put("path",BASE_FILE_URL+fullPath);
            map.put("msg","上传成功");
        }catch (Exception e){
            e.printStackTrace();
            map.put("msg","上传失败");
        }
        return map;
    }
}

3.2.4 上传缩略图

@RestController
public class FileController {

    @Value("${base.file.url}") //获取yml中的路径
    private String BASE_FILE_URL;

    @Autowired //注入fastdfs-client客户端
    private FastFileStorageClient fastFileStorageClient;

    @RequestMapping("/upload1")
    public Map<String,Object> uploadFile1(MultipartFile file){
        Map<String,Object> map = new HashMap<>();
        try {
            //获取文件后缀
            String originalFilename = file.getOriginalFilename();
            String fileExtName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            //1.上传原图+缩略图
            //参数1: 文件输入流
            //参数2: 文件大小
            //参数3: 文件后缀
            //参数4: 元数据
            //上传缩略图:
            StorePath storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), fileExtName, null);
            //2.获取上传后的文件路径,
            String fullPath = storePath.getFullPath();
            // 原图:group1/M00/00/00/wKjlBGNsoFmAcyzjAACs7ev0sfI188.png
            // 缩略图:group1/M00/00/00/wKjlBGNsoFmAcyzjAACs7ev0sfI188_150x150.png
            //3.返回结果
            map.put("path",BASE_FILE_URL+fullPath);
            map.put("msg","上传成功");
        }catch (Exception e){
            e.printStackTrace();
            map.put("msg","上传失败");
        }
        return map;
    }
}

3.3 其他方法

//1.删除方法。
// groupName:组名 
// path:文件路径
void deleteFile(String groupName, String path);


//2.下载文件
<T> T downloadFile(String groupName, String path, DownloadCallback<T> callback);
//例如:
byte[] data = fastFileStorageClient.downloadFile("group1", "M00/00/00/dosaihdas.jpg", new DownloadByteArray());

你可能感兴趣的:(文件存储,java,spring,boot,spring)