Fastdfs分布式文件服务器案例

一:添加依赖

        <!--fastdfs-->
        <dependency>
            <groupId>cn.bestwu</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27</version>
        </dependency>
        <!--用来获取文件扩展名的包-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>    

二:resources下添加配置文件fdfs_client.conf

tracker_server=fastdfs服务器端口
#访问直接使用域名,可省略80端口

三:编写FastdfsUtil类

package cn.ybl.basic.util;

import org.csource.fastdfs.*;

/**
 * @Author Mr.Yang
 * @createTime 2022/7/24 16:21
 * @Describe FastDfs工具类
 */
public class FastDfsUtils {

    //从classpath:resources中的内容最终会编译到classpath下
    public static String CONF_FILENAME  = FastDfsUtils.class.getClassLoader()
            .getResource("fdfs_client.conf").getFile();


    /**
     * 上传文件
     * @param file
     * @param extName:文件的后缀  file:上传文件的byte字节
     * @return
     */
    public static  String upload(byte[] file,String extName) {

        try {
            ClientGlobal.init(CONF_FILENAME);

            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;

            StorageClient storageClient = new StorageClient(trackerServer, storageServer);

            String fileIds[] = storageClient.upload_file(file,extName,null);

            System.out.println(fileIds.length);
            System.out.println("组名:" + fileIds[0]);
            System.out.println("路径: " + fileIds[1]);
            //  /group1/M00/00/09/rBEACmKXF8-AUc6KAANsldwx3H4713.jpg
            return  "/"+fileIds[0]+"/"+fileIds[1];

        } catch (Exception e) {
            e.printStackTrace();
            return  null;
        }
    }
    /**
     * 上传文件
     * @param extName
     * @return
     */
    public static  String upload(String path,String extName) {

        try {
            ClientGlobal.init(CONF_FILENAME);

            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            String fileIds[] = storageClient.upload_file(path, extName,null);

            System.out.println(fileIds.length);
            System.out.println("组名:" + fileIds[0]);
            System.out.println("路径: " + fileIds[1]);
            return  "/"+fileIds[0]+"/"+fileIds[1];

        } catch (Exception e) {
            e.printStackTrace();
            return  null;
        }
    }

    /**
     * 下载文件
     * @param groupName
     * @param fileName
     * @return
     */
    public static byte[] download(String groupName,String fileName) {
        try {

            ClientGlobal.init(CONF_FILENAME);

            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;

            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            byte[] b = storageClient.download_file(groupName, fileName);
            return  b;
        } catch (Exception e) {
            e.printStackTrace();
            return  null;
        }
    }


    /**
     * 删除文件
     * @param groupName
     * @param fileName
     */
    public static void delete(String groupName,String fileName){
        try {
            ClientGlobal.init(CONF_FILENAME);

            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;

            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            int i = storageClient.delete_file(groupName,fileName);
            System.out.println( i==0 ? "删除成功" : "删除失败:"+i);
        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException("删除异常,"+e.getMessage());
        }
    }
}

四:前端上传文件组件发送请求(这里使用的是elementui)

 <el-form-item label="Logo" prop="logo">
          <el-upload
              class="upload-demo"
              action="http://localhost:8080/fastDfs/"
              :on-preview="handlePreview"
              :on-remove="handleRemove"
              :on-success="handleSuccess"
              :file-list="fileList"
              list-type="picture">
            <el-button size="small" type="primary">点击上传</el-button>
            <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
          </el-upload>
        </el-form-item>

五:后台处理数据

package cn.ybl.basic.controller;

import cn.ybl.basic.util.AjaxResult;
import cn.ybl.basic.util.FastDfsUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * @Author Mr.Yang
 * @createTime 2022/7/24 16:26
 * @Describe FastDfs上传接口
 */
@RestController
@RequestMapping("/fastDfs")
public class FastDfsController {

    /**
     * 上传 @RequestPart:接收文件
     * required = true:必须上传一个图片
     * @param file
     * @return AjaxResult
     */
    @PostMapping
    public AjaxResult upload(@RequestPart(required = true,value = "file")MultipartFile file){
        try {
            //获取上传文件的全名
            String originalFilename = file.getOriginalFilename();
            //substring:截取上传文件名(含头不含尾),获取后缀,extName即jpg/png
            String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            //调用方法上传,返回上传文件的路径filePath
            String filePath = FastDfsUtils.upload(file.getBytes(), extName);
            //将filePath返回给前端
            return AjaxResult.getResult().setResultObj(filePath);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.getResult().setMsg("上传失败,请稍后重试");
        }
    }

    /**
     * 删除图片 @RequestParam:key-value形式传参取值
     * @param path
     * @return
     */
    @DeleteMapping
    public AjaxResult delete(@RequestParam(value = "path",required = true) String path){
        //path:/goup1/xxxxx/yyyy
        try {
            //从下标1开始截取,截取后:goup1/xxxxx/yyyy.jpg
            String pathTmp = path.substring(1);
            //截取后:substring = group1
            String substring = pathTmp.substring(0, pathTmp.indexOf("/"));
            //截取后:substring1 = xxxxx/yyyy.jpg
            String substring1 = pathTmp.substring(pathTmp.indexOf("/") + 1);
            //调用工具类的删除方法
            FastDfsUtils.delete(substring,substring1);
            return AjaxResult.getResult();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.getResult().setMsg("删除失败,请稍后重试");
        }
    }
}

 

posted @ 2022-07-27 12:12  yyybl  阅读(15)  评论(0)    收藏  举报