文件上传与下载

文件上传与下载

在Spring Boot中实现文件上传与下载的功能通常涉及前端和后端的交互。前端负责提供文件选择的界面和触发上传/下载操作,后端则负责处理文件上传的请求、存储文件,以及处理文件下载的请求并发送文件内容给前端。

文件上传

  1. 前端:使用HTML表单或JavaScript库来选择文件并发送POST请求到后端。
  2. 后端:在Spring Boot中,你可以使用MultipartFile接口来处理文件上传。下面是一个简单的示例。

前端

<div class="container"><h1 class="title">文件上传</h1><form action="/uploadFile" enctype="multipart/form-data" method="post"><div class="upload-area"><input type="file" id="fileInput" name="files"multiple onchange="updateFileList(this)"><button type="submit" >上传文件</button></div><ul id="fileList" class="file-list"></ul></form><p id="uploadSuccess" class="upload-success" th:text="${uploadStatus}">文件上传成功!</p></div>

后端Controller示例:

实体表

@Data
@TableName("attachment")
public class Attachment {@TableId(type = IdType.AUTO)private Long id;private String fileName;private String storagePath;
}

上传页面访问方法

@Controller
public class FileController {@Autowiredprivate IAttachmentService attachmentService;// 向文件上传页面跳转@GetMapping("/toUpload")public String upload(){return "upload";}
}

文件上传方法

  //文件上传管理@PostMapping("/uploadFile")public String uploadFile(MultipartFile[] files, Model model){// 默认文件上传成功,并返回状态信息model.addAttribute("uploadStatus", "上传成功!");for(MultipartFile file:files){// 获取文件名以及后缀名String fileName = file.getOriginalFilename();// 重新生成文件名(根据具体情况生成对应文件名)fileName = UUID.randomUUID()+"_"+fileName;// 指定上传文件本地存储目录,不存在需要提前创建String dirPath = "D:/file/";File filePath = new File(dirPath);if(!filePath.exists()){filePath.mkdirs();}try {file.transferTo(new File(dirPath+fileName));//文件信息存储到数据库中Attachment attachment = new Attachment();attachment.setFileName(file.getOriginalFilename());attachment.setStoragePath(fileName);attachmentService.save(attachment);} catch (Exception e) {e.printStackTrace();// 上传失败,返回失败信息model.addAttribute("uploadStatus","上传失败: "+e.getMessage());}}// 携带上传状态信息回调到文件上传页面return "upload";}

文件下载

前端:用户点击下载链接或按钮,触发GET请求到后端。
后端:在后端Controller中处理GET请求,读取文件内容,并将其作为HTTP响应返回给前端。

前端

    <h1>文件下载列表</h1>  <div class="file-list" ><div class="file-item" th:each="attachment:${list}"><p class="file-name" th:text="${attachment.fileName}">文件名1</p><a th:href="${'/download?id='+attachment.id}" class="download-button" download>下载</a></div><!-- 添加更多文件项 -->  </div>  

下载页面访问方法

 /*** 向文件下载页面跳转*/@GetMapping("/toDownload")public String toDownload(Model model){//查询文件信息List<Attachment> list = attachmentService.list();model.addAttribute("list",list);return "download";}

文件下载方法

     // 文件下载@GetMapping("/download")public ResponseEntity<Resource> fileDownload(HttpServletRequest request,Long id)throws Exception{//获取文件数据对象Attachment attachment = attachmentService.getById(id);// 指定要下载的文件根路径String dirPath = "D:/file/";// 创建该文件对象File file = new File(dirPath + attachment.getStoragePath());// 设置响应头HttpHeaders headers = new HttpHeaders();// 通知浏览器以下载方式打开(下载前对文件名进行转码)String filename=getFilename(request,attachment.getFileName());headers.setContentDispositionFormData("attachment",filename);// 定义以流的形式下载返回文件数据headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);InputStreamResource inputStreamResource =new InputStreamResource(Files.newInputStream(file.toPath()));return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);}

文件名乱码处理方法

 // 根据浏览器的不同进行编码设置,返回编码后的文件名private String getFilename(HttpServletRequest request, String filename)throws Exception {// IE不同版本User-Agent中出现的关键词String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};// 获取请求头代理信息String userAgent = request.getHeader("User-Agent");for (String keyWord : IEBrowserKeyWords) {if (userAgent.contains(keyWord)) {//IE内核浏览器,统一为UTF-8编码显示,并对转换的+进行更正return URLEncoder.encode(filename, "UTF-8").replace("+"," ");}}//火狐等其它浏览器统一为ISO-8859-1编码显示return new String(filename.getBytes("UTF-8"), "ISO-8859-1");}

效果测试

文件上传

在这里插入图片描述
文件下载页面

在这里插入图片描述

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

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

相关文章

六西格玛绿带培训:初学者的综合质量管理入门课

对于那些希望在业务流程改进和质量管理方面迈出第一步的初学者而言&#xff0c;六西格玛绿带培训无疑是一扇开启新世界的大门。这一培训不仅仅是关于学习一套方法论或工具集&#xff0c;更是关于培养一种思维方式&#xff0c;一种以数据为驱动&#xff0c;追求持续改进和卓越的…

Apache-Pulsar安装操作说明

说明 Pulsar 是一种用于服务器到服务器消息传递的多租户高性能解决方案。 Pulsar 的主要特性如下&#xff1a; 对 Pulsar 实例中的多个集群的本机支持&#xff0c;并跨集群无缝地复制消息。 极低的发布和端到端延迟。 无缝可扩展至超过一百万个主题。 一个简单的客户端 API&…

C语言:顺序表专题

目录 一、数据结构之顺序表/链表1.数据结构相关概念1.1什么是数据结构1.2为什么需要数据结构 二、顺序表1.顺序表的概念及结构2.顺序表分类3.动态顺序表的实现 一、数据结构之顺序表/链表 1.数据结构相关概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来…

金融企业区域集中库的设计构想和测试验证

导读 本文探讨了金融企业区域集中库的设计构想和测试验证&#xff0c;包括架构设想、数据库整合场景测试及优势和使用设想。作者提出利用 TiDB 数据库产品集中建设区域集中库&#xff0c;解决 MySQL 存量节点的整合问题&#xff0c;实现部署的标准化、按需扩展和统一运维管理。…

【Python】数据挖掘与机器学习(一)

【Python】数据挖掘与机器学习(一) 大家好 我是寸铁&#x1f44a; 总结了一篇【Python】数据挖掘与机器学习(一)sparkles: 喜欢的小伙伴可以点点关注 &#x1f49d; 【实验1】预测鲍鱼年龄 问题描述 请从一份数据中预测鲍鱼的年龄&#xff0c;数据集在abalone.cvs中&#xff…

anaconda虚拟环境安装apex0.1教程win10

我安装apex0.1的环境是&#xff1a;torch&#xff08;gpu&#xff09;1.8.0&#xff0c;cuda10.2&#xff0c;cuda7.6.5。 第一步&#xff1a;下载对应的pytorch、cuda、cudnn版本 这里就不详细介绍了&#xff0c;具体可以参考我的这篇博文win10中anaconda创建虚拟环境配置py…

【机器学习】K-means聚类算法:原理、应用与优化

一、引言 1、简述聚类分析的重要性及其在机器学习中的应用 聚类分析&#xff0c;作为机器学习领域中的一种无监督学习方法&#xff0c;在数据探索与知识发现过程中扮演着举足轻重的角色。它能够在没有先验知识或标签信息的情况下&#xff0c;通过挖掘数据中的内在结构和规律&a…

【深度学习】海洋生物数据集,图片分类

文章目录 任务描述数据收集数据处理模型训练指标评测web app代码和帮助 任务描述 收集9种以上的海洋生物图片&#xff0c;然后基于深度学习做一个分类模型&#xff0c;训练完成后&#xff0c;分类模型就可以对未知图片进行分类。 在之后随便传一张图片&#xff0c;分类模型就…

Nacos 入门篇---客户端如何发起服务注册?怎么发送服务心跳的(二)

一、引言 上个章节我们简单学习和使用了下Nacos服务自动注册&#xff0c;本文就来分析下Nacos客户端自动注册服务是怎么实现的&#xff5e; 二、目录 目录 一、引言 三、Nacos 源码编译 1.1 拉取代码 1.2 运行起来 四、客户端使用版本选择 五、Nacos客户端项目启动为什么会…

2024六西格玛黑带通关秘笈:十大统计学考点一网打尽!

近年来&#xff0c;六西格玛作为一种追求卓越的管理方法&#xff0c;越来越受到企业的青睐。而六西格玛黑带认证&#xff0c;更是对这一管理方法的深入理解和实践能力的有力证明。想要在2024年顺利通关六西格玛黑带认证&#xff0c;掌握统计学的基础知识是必不可少的。天行健六…

docker-compose安装dozzle

dozzle是一个docker日志的webui工具 安装配置 docker-compose.yaml version: "3" services:dozzle:container_name: dozzleimage: amir20/dozzle:v4.11.4volumes:- /var/run/docker.sock:/var/run/docker.sockrestart: unless-stoppedports:- 20342:8080networks:cu…

如何从零基础进入IT行业

目录 前言1 确定适合的方向1.1 前端开发1.2 后端开发1.3 数据分析1.4 软件测试1.5 产品管理1.6 网络与系统管理 2 制定学习计划2.1 学习基础知识2.2 选择合适的学习资源2.3 参加课程或培训2.4 制定学习计划和目标 3 实践项目和参与社区3.1 构建个人项目3.2 参与开源社区3.3 寻找…