一、Spring Boot 中集成 fastdfs文件上传

二、实现fastdfs文件上传与延迟删除功能的Spring Boot项目

目录

      • 1、Spring Boot 版本
      • 2、 fastdfs 版本依赖
      • 3、增加配置文件
      • 4、创建FastDFS配置类,增加工具类
      • 6、 增加对外接口

1、Spring Boot 版本

	<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.7</version>`在这里插入代码片`<relativePath/> <!-- lookup parent from repository --></parent>

2、 fastdfs 版本依赖

在您的pom.xml文件中,添加FastDFS客户端的依赖项。这里使用的是tobato提供的FastDFS客户端库。

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

3、增加配置文件

在application.properties或application.yml中配置FastDFS服务器的地址和其他相关参数。

# fastdfs文件系统 
fdfs:tracker-list: #TrackerList参数,支持多个- 192.168.162.235:22122#- 192.168.162.239:22122so-timeout: 1501connect-timeout: 601thumb-image: #缩略图生成参数width: 200height: 200pool:max-total: 500max-wait-millis: 5000max-total-per-key: 100

4、创建FastDFS配置类,增加工具类

 
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.file.Files;import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import com.github.tobato.fastdfs.FdfsClientConfig;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;import lombok.extern.slf4j.Slf4j;/*** FastDFS文件上传下载包装类*/
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
@Component
@Slf4j
public class FileClient {@Autowiredprivate FastFileStorageClient storageClient;/*** 上传文件** @param file 文件对象* @return 文件访问地址* @throws IOException*/public String uploadFile(MultipartFile file) throws IOException {log.info("FileClient->uploadFile,file={}", file);String extension = getExtension(file);StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),extension, null);return getResAccessUrl(storePath);}public static String getExtension(MultipartFile file) {String trimStr = StringUtils.trim(file.getOriginalFilename());String extension = FilenameUtils.getExtension(trimStr);return extension;}public String uploadFile(InputStream inputStream, Long fileSize, String originalFilename) throws IOException {StorePath storePath = storageClient.uploadFile(inputStream, fileSize,FilenameUtils.getExtension(StringUtils.trim(originalFilename)), null);return getResAccessUrl(storePath);}public String uploadFile(File file) throws IOException {String extension = FilenameUtils.getExtension(StringUtils.trim(file.getName()));//Fastdf扩展名不能为空,默认为"txt"if (StringUtils.isEmpty(extension)) {extension = "txt";}StorePath storePath = storageClient.uploadFile(Files.newInputStream(file.toPath()), file.length(),extension, null);return getResAccessUrl(storePath);}/*** 将一段字符串生成一个文件上传** @param content       文件内容* @param fileExtension* @return*/public String uploadFile(String content, String fileExtension) {byte[] buff = content.getBytes(Charset.forName("UTF-8"));ByteArrayInputStream stream = new ByteArrayInputStream(buff);StorePath storePath = storageClient.uploadFile(stream, buff.length, fileExtension, null);return getResAccessUrl(storePath);}// 封装图片完整URL地址private String getResAccessUrl(StorePath storePath) {String fileUrl = "/"+storePath.getFullPath();return fileUrl;}/*** 传图片并同时生成一个缩略图 "JPG", "JPEG", "PNG", "GIF", "BMP", "WBMP"** @param file 文件对象* @return 文件访问地址* @throws IOException*/public String uploadImageAndCrtThumbImage(MultipartFile file) throws IOException {StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(),FilenameUtils.getExtension(file.getOriginalFilename()), null);return getResAccessUrl(storePath);}/*** 删除文件** @param fileUrl 文件访问地址*/public boolean deleteFile(String fileUrl) {if (StringUtils.isEmpty(fileUrl)) {log.error("删除文件异常,fileUrl is empty");return true;}try {StorePath storePath = StorePath.parseFromUrl(fileUrl);storageClient.deleteFile(storePath.getGroup(), storePath.getPath());} catch (Exception e) {log.error("删除文件异常:", e);return false;}return true;}}

6、 增加对外接口

	@ApiOperation(value = "1、上传单个文件到FastDFS", notes = "")@PostMapping("uploadSingle")@ApiImplicitParams(value = {@ApiImplicitParam(name = "file", value = "单个文件", required = true, dataType = "__file",dataTypeClass =MultipartFile.class ) })public Result<FileItem> uploadSingle(FileUploadVo fileUploadVo) {log.info("FileApiController->uploadSingle processing......");FileItem fileItem = null;try {fileItem = uploadThenReturn(fileUploadVo.getFile(), fileUploadVo.getProjectCode(), fileUploadVo.getDeleteDelaySeconds());return ResultKit.succeed(fileItem);} catch (Exception e) {String errorInfo = LogKit.format("FileApiController->uploadSingleMap error,fileItem:{}.", fileItem);String content = errorInfo + ExceptionKit.getErrorInfoFromException(e);return ResultKit.error(ResultEnums.FAIL.getCode(),e.getMessage());}}private FileItem uploadThenReturn(MultipartFile file, String projectCode, Integer deleteDelaySeconds)throws IOException {String fileName = file.getOriginalFilename();log.info("FileApiController->uploadThenReturn start,fileName:{}.", fileName);String url = fileClient.uploadFile(file);String extension = FileClient.getExtension(file);FileItem fileItem = new FileItem(fileName, url, file.getSize(), extension);fileLogBizService.addLog(fileItem, projectCode, deleteDelaySeconds);log.info("FileApiController->uploadThenReturn end,fileItem:{}.", fileItem);return fileItem;}@ApiOperation(value = "2、删除文件")@PostMapping("delete")public Result<Boolean> delete(@RequestParam String projectCode, @RequestParam String token,@RequestParam String fileUrl, Integer delaySeconds) {log.info("FileApiController->delete start,fileUrl={}", fileUrl);boolean succeed = fileLogBizService.deleteFile(projectCode, fileUrl, delaySeconds);return ResultKit.succeedOrError(succeed);}@ApiOperation(value = "3、下载文件", notes = "")@GetMapping("download")public void download(@RequestParam String projectCode, @RequestParam String token, HttpServletResponse response,@RequestParam String url) throws IOException {String saveDir = FileOpenController.getTmpFileDir() + File.separator;// linux出现了,目录不会自动创建FileUtils.forceMkdir(new File(saveDir));try {String fdsfUrl = fileBizService.handleUrlDomain(url);FileKit.writeUrlFileToOutputStream(fdsfUrl, saveDir, response.getOutputStream());} catch (Exception e) {log.error("FileApiController->downloadFile error", e);}}public static String getTmpFileDir() {String saveDir = FileKit.getTmpDir() + File.separator + "file";return saveDir;}

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

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

相关文章

Linux:搭建ntp服务器

我准备两个centos7服务器 一个为主服务器连接着外网&#xff0c;并且搭建了ntp服务给其他主机同步 另外一个没有连接外网&#xff0c;通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器&#xff0c;主…

idea项目mapper.xml中的SQL语句黄色下划线去除

问题描述 当我们使用idea开发java项目时&#xff0c;经常会与数据库打交道&#xff0c;一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句&#xff0c;每当写完SQL语句的时候总是有黄色下划线&#xff0c;看着很不舒服。 解决方案&#xff1a; 修改idea的配置 Edi…

服务器段的连接端口和监听端口编程实现

new ServerSocket(int)是开启监听端口&#xff0c;并不是连接端口。真正的连接端口是随机开辟的空闲端口&#xff0c;当连接创建完成后&#xff0c;监听关口可以继续等待下一次连接请求&#xff0c;处于空闲等待状态。 编程实现方式 1 、主线程一直处于阻塞等待状态&#xff0c…

C 练习实例77-指向指针的指针-二维数组

关于数组的一些操作 #include<stdio.h> #include<stdio.h> void fun(int b[],int length) {for(int i0;i<length;i){printf("%d ",b[i]);}printf("\n");for(int i0;i<length;i){ //数组作为形参传递&#xff0c;传递的是指针&#xff0…

leetcode116填充每个节点的下一个右侧节点指针

思路&#xff1a; BFS&#xff0c;层次遍历的时候&#xff0c;我用的Queue存储每层的所有元素&#xff0c;因此我先用Node* node保存Q的第一个元素&#xff0c;然后把Q的第一个pop掉&#xff0c;然后让node的next指向pop之后的Q的第一个元素&#xff0c;就顺理成章完成了本题&a…

人工智能如何撬动新质生产力发展?

全国两会期间&#xff0c;“新质生产力”成为高频词&#xff0c;引发高度关注。新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级催生的当代先进生产力。而人工智能被视为形成新质生产力的重要引擎。 随着人工智能&#xff08;AI&#xff09;技术跨越奇点…

Python3+RIDE+RobotFramework自动化测试框架搭建

Python2.7已于2020年1月1日开始停用&#xff0c;之前RF做自动化都是基于Python2的版本。 没办法&#xff0c;跟随时代的脚步&#xff0c;我们也不得不升级以应用新的控件与功能。 升级麻烦&#xff0c;直接全新安装。 一、Python安装 最新版Python下载地址&#xff1a;http…

Level 2 行情数据存储处理

DolphinDB 处理 Level 2 行情数据实例 Level 2 高频行情数据包含大量有价值的信息&#xff0c;利用这些数据生成交易信号和获取收益已经成为量化研究中的一种主流策略。作为一个高性能时序数据库&#xff0c;DolphinDB 非常适合存储、处理 GB 级别甚至 PB 级别的海量数据集&…

Python环境下基于注意力机制的小样本轴承故障诊断

传统的基于特征提取与分类相结合的轴承智能诊断算法&#xff0c;对信号处理要求很高的专家经验&#xff0c;既费时又缺乏通用性。基于深度学习的智能轴承故障诊断方由于具有强大的特征提取能力&#xff0c;避免了繁琐复杂的特征提取工作&#xff0c;但是大多数研究都是在标准数…

抖音小店营业执照怎么办理?执照办理有哪些注意事项?

大家好&#xff0c;我是电商糖果 开店前我们需要办理一张执照&#xff0c;而新手开店基本都是个体执照。 所以这篇文章也主要讲个体执照的办理方法和注意事项。 抖音小店办理方法一共有三种。 第一种&#xff1a;自己去当地工商局办理 准备好法人身份证原件&#xff0c;复印…

共谋企业出海新篇章纷享销客荣获数字中国企业峰会“卓越成果奖”

3月9日&#xff0c;2024数字中国企业峰会在杭州西湖中维香溢大酒店成功举办&#xff0c;众多数字化领域专家、知名企业 CIO 代表到场。峰会旨在推动数字化转型与创新发展&#xff0c;为企业出海和国际合作搭建交流与合作的平台。本次峰会的颁奖环节&#xff0c;纷享销客凭借其卓…

Linux开发 -- 编写脚本

使用脚本可以提高工作效率、减少人为错误、简化复杂操作、增加系统自动化管理能力等&#xff0c;是 Linux 系统管理和开发中非常重要的工具之一。 1.常见指令 变量操作&#xff1a; &#xff1a;赋值操作符&#xff0c;用于给变量赋值。$&#xff1a;变量引用符号&#xff0c;…

【已解决】MySQL:常用的除法运算+精度处理+除数为0处理

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 1、除法运算&#xff1a; 拓展&#xff1a;MySQL中常用的几种除法运算 1、取整除法 2、浮点数除法 3、取余除法 4、向上取整除法 5、向下取整除法 2、运算结果的精度处理 1.1、浮点数 1.2、总位数 1.3、…

【NLP10-fasttext工具】

了解fasttext工具的作用 了解fasttext工具的优势及其原因 掌握fasttext的安装方法 1、认识fasttext工具 1.1、作用&#xff1a; 进行文本分类 训练词向量 1.2、工具包优势 正如它的名字&#xff0c;在保持较高精度的情况下&#xff0c;快速的进行训练和预测是fasttext的…

android 怎么自定义view

首先了解view的绘制流程: 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout,确定子view 而onDraw----是继承view时候需要操作的。 所以:自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件。 自定义Vi…

python打包时遇见第三方包有隐藏依赖或者出现依赖错误

使用pyinstaller 打包成exe 文件步骤&#xff1a; 1.创建虚拟环境&#xff0c;并激活虚拟环境 #创建虚拟环境 python -m venv myenv #激活虚拟环境&#xff08;windows&#xff09; myenv\Scripts\activate2.导出需要的依赖 pip freeze > requirements.txt 或者 pip list …

社会规范和个人规范

世界有两套规范&#xff1a;社会规范和个人规范。 社会规范&#xff1a;友好&#xff0c;界限不明&#xff0c;不要求及时回报。 市场规范&#xff1a; 没有友情&#xff0c;没有爱情&#xff0c;没有小市民伤感&#xff0c;只有交易。 在传统经济学中&#xff0c;交易覆盖了…

AutoCAD 2020:三维建模与渲染,设计未来的建筑蓝图

AutoCAD 2020是一款功能强大且广泛应用的计算机辅助设计软件&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;满足了机械、建筑、家居、纺织等诸多行业的设计需求。以下是AutoCAD 2020的一些主要功能介绍&#xff1a; 保存和安装优化&#xff1a;AutoCAD 2020在性能上进…

观成科技-基于自适应学习的人工智能加密流量检测技术

1.前言 人工智能技术的广泛应用正在深刻改变我们的生活。在网络安全领域&#xff0c;基于机器学习的检测技术也应用在许多场景中。随着信息技术的迅猛发展和数字化转型的深入推进&#xff0c;加密技术逐渐成为保障网络安全和数据隐私的核心手段&#xff0c;而基于机器学习的检…

企业HR怎么看待PMP证书?

企业HR在招聘和选拔人才时&#xff0c;往往会参考各种证书和资格来评估候选人的专业能力和素质。PMP&#xff08;Project Management Professional&#xff09;证书作为全球公认的项目管理专业人士认证&#xff0c;对于企业HR来说&#xff0c;无疑具有一定的参考价值。那么&…