当前位置: 首页 > article >正文

Spring Boot简单集成fastDFS

FastDFS简介

FastDFS是一个开源的轻量级分布式文件系统,它解决了大容量存储和负载均衡的问题。FastDFS架构包括Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,Tracker server负责负载均衡和调度,最终由Storage server完成文件上传和下载。

Spring Boot项目集成FastDFS

添加Maven依赖

在你的Spring Boot项目的pom.xml文件中添加FastDFS Java客户端的依赖。例如:

<dependency>
  <groupId>com.github.tobato</groupId>
  <artifactId>fastdfs-client-spring-boot-starter</artifactId>
    <version>最新版本号</version>
</dependency>

注意:这里的版本号应该替换为FastDFS Java客户端的最新稳定版本。

配置FastDFS连接

在Spring Boot的配置文件(如application.properties或application.yml)中添加FastDFS的连接配置。
例如,在application.yml中配置,

fdfs:
  so-timeout: 1500
  connect-timeout: 600
  thumb-image:
    height: 50
    width: 50
  tracker-list:
    - Tracker服务器地址:端口

创建一个Controller来处理文件上传和下载请求

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

@RestController
@RequestMapping("/file")
public class FileController {

    @Autowired
    private FastFileStorageClient storageClient;

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("文件为空");
        }

        try {
            StorePath storePath = storageClient.uploadFile(
                    file.getInputStream(),
                    file.getSize(),
                    FileUtils.getExtension(file.getOriginalFilename()),
                    null
            );
            return ResponseEntity.ok(storePath.getFullPath());
        } catch (IOException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败");
        }
    }

    @GetMapping("/download")
    public ResponseEntity<byte[]> downloadFile(@RequestParam("group") String group, @RequestParam("path") String path) {
        if (StringUtils.isEmpty(group) || StringUtils.isEmpty(path)) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new byte[0]);
        }

        try {
            byte[] fileContent = storageClient.downloadFile(group, path, null);
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + path.substring(path.lastIndexOf("/") + 1) + "\"");
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            return new ResponseEntity<>(fileContent, headers, HttpStatus.OK);
        } catch (IOException e) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new byte[0]);
        }
    }
}

http://www.kler.cn/a/455692.html

相关文章:

  • 【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门
  • python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
  • SpringBoot的pom.xml文件中,scope标签有几种配置?
  • LabVIEW条件配置对话框
  • blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质
  • 教育元宇宙的优势与核心功能解析
  • Linux应用软件编程-多任务处理(线程)
  • 【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体
  • Redis学习笔记之——数据类型篇(一)
  • JVM简介—3.JVM的执行子系统
  • 【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析
  • 关键客户转化为会员的重要性及 “开源 AI 智能名片 2 + 1 链动模式商城小程序” 在其中的应用剖析
  • 园区网综合拓扑实验
  • 正则表达式(三剑客之awk)
  • Edge SCDN酷盾安全重塑高效安全内容分发新生态
  • DevNow x Notion
  • 【python因果库实战13】因果生存分析2
  • STM32-笔记11-手写带操作系统的延时函数
  • 笔记:使用python对飞书用户活跃度统计的一个尝试
  • Go Redis实现排行榜
  • 神经网络-ResNet
  • 【社区投稿】自动特征auto trait的扩散规则
  • Effective C++ 条款32:确定你的 public 继承塑模出 is-a 关系
  • Pytorch | 利用IE-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 如何在 Spring Boot 微服务中设置和管理多个数据库
  • 对外发PDF设置打开次数