分布式文件存储FastDFS之客户端API实现文件上传下载

目录

一、概述

二、文件上传、下载和删除实现

 三、总结


一、概述

前面几篇文章已经搭建好了FastDFS环境,在实际工作中,一般都是使用FastDFS客户端API来上传或者下载文件,本篇文章就将总结一下如何通过客户端API实现文件的上传和下载。

FastDFS_Client源码Github地址:https://github.com/tobato/FastDFS_Client

二、文件上传、下载和删除实现

首先,我们创建一个springboot项目,项目目录结构大体如下:

【a】引入FastDFS、Thymeleaf等依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--commons-io依赖-->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-io</artifactId>
  <version>1.3.2</version>
</dependency>
<!-- taobao fastdfs依赖 -->
<dependency>
  <groupId>com.github.tobato</groupId>
  <artifactId>fastdfs-client</artifactId>
  <version>1.26.5</version>
</dependency>

【b】application.yml配置文件:配置FastDFS跟踪器tracker地址、上传文件大小限制等信息

server:
  port: 80
# 分布式文件系统FDFS配置
fdfs:
  soTimeout: 1500 #socket连接超时时长
  connectTimeout: 600 #连接tracker服务器超时时长
  reqHost: 192.168.179.133   #nginx访问地址
  reqPort: 80              #nginx访问端口
  thumbImage: #缩略图生成参数,可选
    width: 150
    height: 150
  trackerList: #TrackerList参数,支持多个,这里只有一个,如果有多个在下方加- x.x.x.x:port
    - 192.168.179.133:22122
    #- 192.168.179.134:22122
    #- 192.168.179.135:22122
spring:
  application:
    name: fastdfs-demo
  servlet:
    multipart:
      enabled: true
      max-file-size: 10MB
      max-request-size: 20MB

【c】配置FastDFS

import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;

@Configuration
/**
 * 导入FastDFS-Client组件
 */
@Import(FdfsClientConfig.class)
/**
 * 解决jmx重复注册bean的问题
 */
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class CustomFastDFSConfiguration {

}

【d】启动类

@SpringBootApplication
public class FastdfsDemoApplication {

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

}

【e】编写FastDFS操作文件的工具类

FastDFS上传、下载以及删除文件底层都是靠的FastFileStorageClient对象来对文件进行操作。

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 org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileOutputStream;
import java.io.IOException;

@Component
public class FastDFSClientUtils {

    private static Logger logger = LoggerFactory.getLogger(FastDFSClientUtils.class);

    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    /**
     * 上传文件
     */
    public String uploadFile(MultipartFile multipartFile) throws Exception {
        String originalFilename = multipartFile.getOriginalFilename().
                substring(multipartFile.getOriginalFilename().
                        lastIndexOf(".") + 1);
        StorePath storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(
                multipartFile.getInputStream(),
                multipartFile.getSize(), originalFilename, null);
        return storePath.getFullPath();
    }

    /**
     * 删除文件
     */
    public void deleteFile(String fileUrl) {
        if (StringUtils.isEmpty(fileUrl)) {
            logger.info("需要删除的文件路径为空......");
            return;
        }
        try {
            StorePath storePath = StorePath.parseFromUrl(fileUrl);
            fastFileStorageClient.deleteFile(storePath.getGroup(), storePath.getPath());
        } catch (Exception e) {
            logger.info(e.getMessage());
        }
    }

    /**
     * 下载文件
     */
    public byte[] downloadFile(String fileUrl) {
        String group = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
        logger.info("下载文件的group: {},path: {}", group, path);
        DownloadByteArray downloadByteArray = new DownloadByteArray();
        byte[] bytes = fastFileStorageClient.downloadFile(group, path, downloadByteArray);
        try {
            //将文件保存到d盘
            FileOutputStream fileOutputStream = new FileOutputStream("d:\\image.png");
            fileOutputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bytes;
    }

}

【f】编写文件操作Controller类

import com.springboot.fastdfs.fastdfsdemo.utils.FastDFSClientUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.util.Arrays;

@Controller
public class FastDFSController {

    private static final Logger logger = LoggerFactory.getLogger(FastDFSController.class);

    @Resource
    private FastDFSClientUtils fastDFSClientUtils;

    @GetMapping("/")
    public String index() {
        return "upload";
    }

    /**
     * 文件上传
     */
    @RequestMapping(value = "/uploadFile", headers = "content-type=multipart/form-data", method = RequestMethod.POST)
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        String result;
        try {
            String path = fastDFSClientUtils.uploadFile(file);
            if (!StringUtils.isEmpty(path)) {
                result = path;
            } else {
                result = "文件上传失败";
            }
        } catch (Exception e) {
            e.printStackTrace();
            result = "服务器异常,请稍后重试!";
        }
        return ResponseEntity.ok(result);
    }

    /**
     * 文件删除
     */
    @RequestMapping(value = "/deleteByPath", method = RequestMethod.GET)
    public ResponseEntity<String> deleteByPath(@RequestParam("filePathName") String filePathName) {
        if (StringUtils.isBlank(filePathName)) {
            logger.error("请传入需要删除的文件路径!");
            return ResponseEntity.ok("请传入需要删除的文件路径!");
        }
        fastDFSClientUtils.deleteFile(filePathName);
        return ResponseEntity.ok("文件删除成功!");
    }

    /**
     * 文件下载
     */
    @GetMapping("/downloadFile")
    public void downloadFile(@RequestParam("filePathName") String filePathName, HttpServletResponse response) {
        if (StringUtils.isBlank(filePathName)) {
            logger.error("请传入需要下载的文件路径!");
        } else {
            byte[] bytes = fastDFSClientUtils.downloadFile(filePathName);
            logger.info(Arrays.toString(bytes));

            //此处需要设置ISO8859-1,application/octet-stream为未知文件类型时使用
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            BufferedOutputStream output;
            try {
                output = new BufferedOutputStream(response.getOutputStream());
                response.setHeader("Content-Disposition", "attachment;filename=image.png");
                output.write(bytes);
                response.flushBuffer();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

【g】新建文件上传页面upload.html

<!DOCTYPE html>
<html>
<body>

<h1>FastDFS 文件上传案例</h1>

<form method="POST" action="/uploadFile" enctype="multipart/form-data">
    <input type="file" name="file"/><br/><br/>
    <input type="submit" value="上传文件"/>
</form>

</body>
</html>

【h】测试文件上传

在启动项目之前,确保FastDFS环境都已经启动成功,项目启动完成后,我们浏览器访问:

http://localhost/uploadFile,随便上传一张图片:

如下图,可见FastDFS成功将文件保存到Storage中,并返回了文件所在的路径:

【i】测试文件下载

浏览器访问:http://localhost/downloadFile?filePathName=group1/M00/00/00/wKizhV-zJBmAGhTaAAAxXVoV3i4853.png,这里我们就以下载上一步上传的那张图片为例,

如下图,成功下载文件并查看。

【j】测试文件删除

浏览器访问:http://localhost/deleteByPath?filePathName=group1/M00/00/00/wKizhV-zJBmAGhTaAAAxXVoV3i4853.png

如下图,FastDFS成功删除文件。

文件删除成功后,我们再次访问前面的下载文件看看,可以看到报错了,文件已经被删除,找不到了。

 三、总结

本篇文章通过一个简单的示例总结了如何通过FastDFS 客户端API去操作我们的文件,仅仅只是入门的示例,真正生产环境肯定还需要封装其他很多东西。由于笔者水平有限,文中若有不对之处,还望指正。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值