【SpringBoot整合系列】SpringBoot整合FastDFS(二)

news2024/11/29 20:51:04

目录

  • SpringBoot整合FastDFS
    • Java客户端/依赖
    • 常用api接口解释
      • 1.uploadFile
        • 参数
        • 返回值
      • 2.uploadSlaveFile
        • 参数
        • 返回值
      • 3.getMetadata
        • 参数
        • 返回值
      • 4.overwriteMetadata
        • 参数:
        • 返回值:无
      • 5.mergeMetadata
        • 参数:
        • 返回值:无
      • 6.queryFileInfo
        • 参数:
        • 返回值
      • 7.deleteFile
        • 参数:
        • 返回值:无
      • 8.downloadFile
        • 参数
        • 返回值
      • 9.downloadFile
        • 参数
        • 返回值
    • 代码测试
      • yml配置
      • 工具类
      • 上传
        • Controller
        • 测试
      • 下载
        • Controller
        • 测试

SpringBoot整合FastDFS

Java客户端/依赖

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

常用api接口解释

1.uploadFile

uploadFile(String groupName, InputStream inputStream, long fileSize, String fileExtName)

参数
  • groupName:上传文件所属的组名。
  • inputStream:输入流对象,指向要上传的文件内容。
  • fileSize:上传文件的大小,单位为字节。
  • fileExtName:上传文件的扩展名。
返回值

返回值:一个 StorePath 对象,其中封装文件的路径和 store 节点的地址。

2.uploadSlaveFile

uploadSlaveFile(String groupName, String masterFilename, InputStream inputStream, long fileSize, String prefixName, String fileExtName)

参数
  • groupName:文件上传到的组名。
  • masterFilename:主文件的名称。
  • inputStream:从文件的输入流对象。
  • fileSize:上传从文件的大小,单位为字节。
  • prefixName: 从文件名前缀
  • fileExtName:从文件的扩展名
返回值

返回值:一个 StorePath 对象,表示成功上传后从文件存储的路径信息。

3.getMetadata

getMetadata(String groupName, String path)

参数
  • groupName:文件所属的分组名。
  • path:文件的在 FastDFS 存储中真实的路径。
返回值

返回值:Set 集合,其中包含多组 metadata 信息。每一条 metadata 是 k-v 形式的键值对。如果没有找到对应的 metadata 信息,则返回一个空的集合。

4.overwriteMetadata

overwriteMetadata(String groupName, String path, Set metaDataSet)

参数:
  • groupName:文件所属的分组名。
  • path:文件在 FastDFS 存储中真实的路径。
  • metaDataSet:要覆盖的新的 metadata 集合。
返回值:无

5.mergeMetadata

mergeMetadata(String groupName, String path, Set metaDataSet)

参数:
  • groupName:文件所属的分组名。
  • path:文件在 FastDFS 存储中真实的路径。
  • metaDataSet:待合并的metadata集合。
返回值:无

6.queryFileInfo

queryFileInfo(String groupName, String path)

参数:
  • groupName:文件所属的组名。
  • path:文件在 FastDFS 存储中真实的路径。
返回值

返回值:一个 FileInfo 对象,包含了文件的元数据信息。

7.deleteFile

deleteFile(String groupName, String path)

参数:
  • groupName:文件所属的组名。
  • path:文件在 FastDFS 存储中真实的路径。
返回值:无

8.downloadFile

downloadFile(String groupName, String path, DownloadCallback callback)

参数
  • groupName:文件所属的组名。
  • path:文件在 FastDFS 存储中真实的路径。
  • callback:下载回调接口对象。
返回值

返回值:一个泛型值对象 T,表示经过回调方法处理后的结果。

9.downloadFile

downloadFile(String groupName, String path, long fileOffset, long fileSize, DownloadCallback callback)

参数
  • groupName:文件所属的组名。
  • path:文件在 FastDFS 存储中真实的路径。
  • fileOffset:文件偏移量,从哪个地方开始下载。
  • fileSize:要下载的文件大小。
  • callback:下载回调接口对象。
返回值

返回值:一个泛型值对象 T,表示经过回调方法处理后的结果。

代码测试

yml配置

fdfs:
# 超时时间
  connect_timeout: 5000
  # 读取时间
  so_timeout: 30000
  # 服务地址列表
  tracker-list: 192.168.29.31:22122
# 解决限制文件大小
spring:
  servlet:
    multipart:
      max-request-size: 1TB
      max-file-size: 1TB

工具类

package com.zjl.util;

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.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.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * @author: zjl
 * @datetime: 2024/4/7
 * @desc:
 */
@Component
public class FastdfsUtil {

    @Resource
    private FastFileStorageClient storageClient;

    /**
     * 上传
     *
     * @param file
     * @return
     */
    public String upload(MultipartFile file) {
        // 获取文件名
        String filename = file.getOriginalFilename();
        // 得到文件扩展名
        String extName = filename.substring(filename.lastIndexOf(".") + 1);
        StorePath storePath = null;
        try {
            // 上传
            storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), extName, null);
            // 这个getFullPath是fastdfs返回的id,可通过这个实现图片浏览、视频播放、文件下载等操作
            return storePath.getFullPath();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

/**
     * 下载文件(写二进制流)
     * @param path
     * @return
     */
    public ResponseEntity<byte[]> download(String fileName ,String path,HttpServletRequest request) throws Exception {
        StorePath storePath = StorePath.parseFromUrl(path);
        String substring = path.substring(path.lastIndexOf("."));
        byte[] data = storageClient.downloadFile(storePath.getGroup(), storePath.getPath(), new DownloadByteArray());
        fileName = this.getFilename(request,fileName);
        HttpHeaders httpHeaders = new HttpHeaders();
        // 设置下载响应类型以及文件名
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        httpHeaders.setContentDispositionFormData("attachment",fileName+substring );
        return new ResponseEntity<>(data,httpHeaders, HttpStatus.OK);
    }

    //解决中文下载问题
    public String getFilename(HttpServletRequest request, String filename) throws Exception {
        //ie浏览器的编码格式
        String[] IEBrowserWords = {"MSIE","Trident","Edge"};
        String userAgent = request.getHeader("User-Agent");
        for (String ieBrowserWord : IEBrowserWords) {
            if(userAgent.contains(ieBrowserWord)){
                return URLEncoder.encode(filename,"UTF-8");
            }
        }
        //其他浏览器就采用这种编码格式
        return new String(filename.getBytes("UTF-8"),"ISO-8859-1");
    }
}

上传

Controller
package com.zjl.controller;

import com.zjl.util.FastdfsUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;

/**
 * @author: zjl
 * @datetime: 2024/4/7
 * @desc:
 */
@RestController
public class MyFileController {
    @Resource
    private FastdfsUtil fastdfsUtil;
    @PostMapping("/upload")
    public String upload(MultipartFile file){
        return fastdfsUtil.upload(file);
    }
}
测试

在这里插入图片描述
直接访问这个地址:http://192.168.29.31:8888/group1/M00/00/00/wKgdH2YSNj2ABnBCAAEQeS5bVeM384.jpg
在这里插入图片描述

下载

Controller
@GetMapping("/download")
    public ResponseEntity<byte[]> download(HttpServletRequest request) throws Exception {
        //假设这是从其他业务层获取的文件路径
        String filePath = "group1/M00/00/00/wKgdH2YSNj2ABnBCAAEQeS5bVeM384.jpg";
        String fileName = "Spring权限管理";
        return fastdfsUtil.download(fileName,filePath,request);
    }
测试

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1586525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学之光照亮AI之路:探究数学背景在人工智能学习中的优势

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已成为引领未来发展的重要力量。然而&#xff0c;对于许多初涉此领域的学习者来说&#xff0c;AI的复杂性和深度常常让他们望而却步。有趣的是&#xff0c;那些数学基础扎实的人在学习AI时&#xff0c;往往…

【Docker】docker快速安装部署fastdfs的镜像详细记录

部署nacos的docker镜像 第一步&#xff1a; 获取fastdfs镜像1、查看镜像列表2、创建本地映射文件夹 第二步&#xff1a;运行镜像1.使用docker镜像构建tracker服务2.使用docker镜像构建Storage服务3.Storage服务中默认安装了Nginx服务4.如果需要修改storage则配置则进到以下目录…

Python 全栈体系【四阶】(二十八)

第五章 深度学习 四、TensorFlow 1. Tensorflow 简介 1.1 什么是 Tensorflow TensorFlow 由谷歌人工智能团队谷歌大脑&#xff08;Google Brain&#xff09;开发和维护的开源深度学习平台&#xff0c;是目前人工智能领域主流的开发平台&#xff0c;在全世界有着广泛的用户群…

【电子通识】热风枪的结构与使用方法

热风枪的结构 热风枪是专门用来拆焊、焊接贴片元器件和贴片集成电路的焊接工具&#xff0c;它主要由主机和热风焊枪两大部分构成。 热风枪主要有电源开关、风速设置、温度设置、热风连接等部件组成。根据不同品牌和价位的热风枪&#xff0c;有一些功能齐全的也集成了烙铁功能。…

vivado 设置 ILA 核以执行测量

设置 ILA 核以执行测量 您添加到自己的设计中的 ILA 核会显示在“硬件 (Hardware) ”窗口中的目标器件下。如果未显示这些 ILA 核 &#xff0c; 请右键 单击器件并选择“ Refresh Device ”。这样将重新扫描 FPGA 或 ACAP 并刷新“ Hardware ”窗口。 注释 &#xff1a…

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

集装箱5G智能制造工厂数字孪生可视化平台&#xff0c;推进企业数字化转型。在当下数字化转型的热潮中&#xff0c;集装箱5G智能制造工厂数字孪生可视化平台成为了推动企业转型升级的重要工具。这一平台将先进的5G技术与智能制造相结合&#xff0c;通过数字孪生技术实现生产过程…

Doodle Jump — 使用FlutterFlame开发游戏真不错!

前言 最近网上冲浪的时候&#xff0c;我偶然发现了一个国外的游戏网站&#xff0c;里面聚集了各种有趣的小游戏&#xff0c;类似于国内的4399。在浏览时&#xff0c;我遇到了一款经典的小游戏&#xff1a;Doodle Jump。上一次玩还是在上小学的时候&#xff0c;那时候父母在厨房…

【电子通识】普通电阻、敏感电阻、可调电阻的种类和特点

电阻的作用 在【分立元件】理解电阻 中我们知道电阻是在电路中对电流产生阻碍作用的元件。电阻是电子产品中最基本、最常用的电子元件之一。 有各产品的电路板中基本都有电阻器&#xff0c;通常起限流、滤波或分压等作用。实际上&#xff0c;电阻器的种类很多&#xff0c;根据其…

基于SpringBoot+vue网上点餐系统包含万字文档

基于SpringBoot的网上点餐系统包含万字文档 项目视频演示: springboot027网上点餐系统包含万字文档 开发系统:Windows 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要…

智慧工地管理平台源码:提供专业落地的解决方案

目录 智慧工地平台功能简介 一、劳务实名制系统 二、智能塔吊可视系统 三、视频监控&#xff08;含安全行为识别&#xff09; 四、环境监测&#xff08;联动自动喷淋&#xff09; 五、起重机械管控&#xff08;含吊钩可视化&#xff09; 六、升降电梯智能管控 七、高支…

每天五分钟深度学习:逻辑回归算法的损失函数和代价函数是什么?

本文重点 前面已经学习了逻辑回归的假设函数,训练出模型的关键就是学习出参数w和b,要想学习出这两个参数,此时需要最小化逻辑回归的代价函数才可以训练出w和b。那么本节课我们将学习逻辑回归算法的代价函数是什么? 为什么不能平方差损失函数 线性回归的代价函数我们使用…

KVM 高级功能部署

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;KVM 虚拟机迁移 2&#xff09;KSM 内核同页合并 1.3、案例环境 1&#xff09;本案例环境 2&#xff09;案例需求 3&#xff09;案例实现思路 二、案例实施 2.1、静态迁移 1&#xff09;在…

python---3--sort、lambdalen(list1)、sorted_numbers = sorted(numbers)、list.sort()

学习目标&#xff1a; lambda len(list1) sorted_numbers sorted(numbers)list.sort() 目录 学习目标&#xff1a; 学习内容&#xff1a; 匿名函数 lambda表达式 lambda [参数]: 函数 不需要return len(list1) sorted_numbers sorted(numbers) list.sort(keyNone, r…

【linux篇】ubuntu安装教程

有道是工欲善其事必先利其器&#xff0c;在学习linux前&#xff0c;先得搭建好环境才能事半功倍。 1.VMware虚拟机安装 打开浏览器&#xff0c;可直接在搜索栏中输入VMware。

【算法基础】选择排序与冒泡排序的思想与实现

文章目录 1. 选择排序1.1 思想1.2 实现 2. 冒泡排序2.1 思想2.2 实现 1. 选择排序 1.1 思想 选择排序的思想很简单&#xff0c;如上图所示。在每一次遍历子数组的过程中&#xff0c;选择最小的和子数组的第一位交换。子数组的选择从一开始的整个数组&#xff0c;到后面范围逐渐…

Unity构建详解(7)——AssetBundle格式解析

【文件格式】 文件可以分为文本文件、图片文件、音频文件、视频文件等等&#xff0c;我们常见的这些文件都有行业内的标准格式&#xff0c;其意味着按照一定的规则和规范去保存读取文件&#xff0c;可以获取我们想要的数据。 有些软件会有自己的文件格式&#xff0c;会按照其…

基于SpringBoot+Vue的果蔬种植销售一体化服务平台(源码+文档+部署+讲解)

一.系统概述 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对果蔬种植销售一体化服务管理进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套果蔬种植销售一体…

数字档案馆升级改造的意义

数字档案馆升级改造的意义在于提升档案管理的效率和质量&#xff0c;更好地满足各方面的需求&#xff0c;并为数字时代的档案管理提供更好的支持和保障。具体意义包括&#xff1a; 1. 提高档案存储、检索和利用效率&#xff1a;玖拓智能数字化档案馆可以实现电子存储和快速检索…

zabbix“专家坐诊”第236期问答

问题一 Q&#xff1a;我的trap里已经可以收到信息了&#xff0c;后续要怎么创建监控项呀&#xff1f; A&#xff1a;参考&#xff1a; 问题二 Q&#xff1a;snmp和snmp trap咋搞&#xff1f; A&#xff1a;你指的是如何开启这些协议还是如何做监控项&#xff1f; Q&#xff1…

JUC并发编程2(高并发,AQS)

JUC AQS核心 当有线程想获取锁时&#xff0c;其中一个线程使用CAS的将state变为1&#xff0c;将加锁线程设为自己。当其他线程来竞争锁时会&#xff0c;判断state是不是0&#xff0c;不是自己就把自己放入阻塞队列种&#xff08;这个阻塞队列是用双向链表实现&#xff09;&am…