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

java springboot 实现文件上传下载(文件服务器,文件统一处理,图片,word,pdf,视频,等)

java springboot 实现文件上传下载(文件服务器,文件统一处理,图片,word,pdf,视频,等)

1.数据库设计

CREATE TABLE `file_handle` (`id` varchar(64) NOT NULL,`file_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '文件上传名称',`file_save_name` varchar(128) DEFAULT NULL COMMENT '重命名文件名称UUID',`file_type` int DEFAULT NULL COMMENT '文件类型',`file_path` varchar(255) DEFAULT NULL COMMENT '文件地址',`file_size` float DEFAULT NULL COMMENT '文件大小',PRIMARY KEY (`id`)
)

2.文件预览资源配置(Spring MVC框架中用于配置静态资源处理,不安全可以直接访问静态资源不建议使用)

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class FileHandleConfig implements WebMvcConfigurer {@Value("${file.dir}")private String fileDir;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/fileDownload/**").addResourceLocations("file:" + fileDir);}
}

文件访问地址:http://服务器IP:端口/fileDownload/文件名称(文件名必须要唯一)

3.上传接口

	@Value("${file.dir}")private String fileDir;@PostMapping(value = "/upload")// @TokenCheckerpublic String upload(MultipartFile file) throws IOException {String originalFileName = file.getOriginalFilename();if (StringUtils.isBlank(originalFileName)) {return Response.Fail(CommonErrorCode.DataNotFound);}String extension = originalFileName.substring(originalFileName.lastIndexOf("."));String newFileName = UUID.randomUUID().toString().replace("-","") + extension;String upload_file_dir=fileDir;//注意这里需要添加目录信息String destFileName =  fileDir + newFileName;try {//第一次运行的时候,这个文件所在的目录往往是不存在的,这里需要创建一下目录(创建到了webapp下uploaded文件夹下)File upload_file_dir_file = new File(upload_file_dir);File targetFile = new File(upload_file_dir_file, newFileName);file.transferTo(targetFile);FileHandle fileHandle = new FileHandle();fileHandle.setId(IdUtils.getSnowflakeId(SnowflakeConstant.SYSTEM_MANAGEMENT_ID));fileHandle.setFileName(originalFileName);fileHandle.setFilePath(destFileName);fileHandle.setFileSaveName(newFileName);fileHandle.setCreateTime(new Date());fileHandle.setFileType(1);fileHandle.setDeleted(0);fileHandle.setFileSize(BigDecimal.valueOf(file.getSize() / (1024.0 * 1024.0)).setScale(2, RoundingMode.HALF_UP));fileHandleService.save(fileHandle);if (!upload_file_dir_file.exists()){upload_file_dir_file.mkdirs();}}catch (Exception e){e.printStackTrace();}return Response.OK();}

4.通过文件ID下载文件(原理也是通过接口下载,这里采取的是文件ID,可以自定义字段下载如文件名称,只要该字段唯一就可以)

	@Value("${file.dir}")private String fileDir;@GetMapping("/download/{fileId}")public void download(@PathVariable String fileId, HttpServletResponse response) throws IOException {FileHandle fileHandle = fileHandleService.getById(fileId);if (fileHandle==null) {return;}File file = new File(fileDir+fileHandle.getFileSaveName());if (!file.exists()) {return;}String fileName = fileHandle.getFileName();response.setHeader("Content-Disposition", "attachment;filename=" + URLDecoder.decode(fileName, "UTF-8"));response.setContentType("application/octet-stream");// 创建输出流OutputStream outputStream = response.getOutputStream();// 读取文件并写入输出流FileInputStream inputStream = new FileInputStream(file);byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, len);}// 关闭输出流outputStream.flush();outputStream.close();inputStream.close();}
有不懂的小伙伴可以直接留言给我,感谢你们的关注

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++ 设计模式——命令模式
  • 服务器被渗透的表现及检测方法
  • IT 行业的就业情况
  • (十)Flink Table API 和 SQL 基本概念
  • 【C++指南】内存管理(三)
  • Linux 部署 MinIO(远程服务器)
  • Ubuntu清除缓存的方法--防止系统崩溃
  • C# messagePack对类(class)序列化简单示例
  • 8.21-部署eleme项目
  • 达梦表字段、字段类型,精度比对及更改字段SQL生成
  • Linux之shell脚本变量
  • 【MySQL】一文带你理清<表级锁>(表锁,元数据锁,意向锁)
  • Leetcode 100.101.110.199 二叉树相同/对称/平衡 C++实现
  • MySQL 的半同步模式
  • Python 设置Excel工作表页边距、纸张大小/方向、打印区域、缩放比例
  • __proto__ 和 prototype的关系
  • HTTP中的ETag在移动客户端的应用
  • k个最大的数及变种小结
  • Object.assign方法不能实现深复制
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于组件的设计工作流与界面抽象
  • 将回调地狱按在地上摩擦的Promise
  • 前端_面试
  • 时间复杂度与空间复杂度分析
  • 手机端车牌号码键盘的vue组件
  • 我看到的前端
  • 消息队列系列二(IOT中消息队列的应用)
  • 新版博客前端前瞻
  • 阿里云ACE认证之理解CDN技术
  • 仓管云——企业云erp功能有哪些?
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (WSI分类)WSI分类文献小综述 2024
  • (九)One-Wire总线-DS18B20
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (一)Thymeleaf用法——Thymeleaf简介
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • ****三次握手和四次挥手
  • ***通过什么方式***网吧
  • .axf 转化 .bin文件 的方法
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET简谈设计模式之(单件模式)
  • .NET下ASPX编程的几个小问题
  • .sh 的运行
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [20180224]expdp query 写法问题.txt
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C#]winform部署yolov9的onnx模型