第8章:SpringMVC的文件上传和下载

news2024/11/25 14:55:52

一、文件上传和下载

1.文件下载

使用ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。使用ResponseEntity实现下载文件的功能。

①创建file.html

② 在FileController.java类里面

文件不管是上传还是下载,都是文件复制的过程。所以先通过输入流读取一下。InputStream

//文件下载
@RequestMapping("/testDown")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session, @RequestParam("filename") String filename) throws IOException {
   //获取ServletContext对象
   ServletContext servletContext = session.getServletContext();
   //获取文件的路径
   String realPath = servletContext.getRealPath("/static/img/"+filename);
   //创建输入流
   InputStream is = new FileInputStream(realPath);
   //创建字节数组 is.available()所有字节数,数组的长度
   byte[] bytes = new byte[is.available()];
   //将流读到字节数组中
   is.read(bytes);
   // 创建HttpHeader响应头信息
   MultiValueMap<String, String> headers = new HttpHeaders();
   // 设置下载方式以及下载文件的名字
   headers.add("Content-Disposition", "attachment;filename="+filename);
   // 设置响应状态码
   HttpStatus statusCode = HttpStatus.OK;
   // 创建ResponseEntity对象  响应体,响应头,响应状态码
   ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
   // 关闭流
   is.close();
   return responseEntity;
}

②如果只实现页面跳转,不进行业务逻辑处理。在SpringMVC.xml里面

<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<mvc:annotation-driven />

2.文件上传

  • 文件上传要求form表单并且是post
  • 添加属性enctype=“multipart/form-data”,二进制上传
  • SpringMVC将上传的文件封装到MultipartFile对象中。通过此对象获取文件相关信息。

①file.html页面

<form th:action="@{/testUp}" action="post" enctype="multipart/form-data">
    头像<input type="file" name="photo"><br><br>
    <input type="submit" value="上传">
</form>

 ②添加相关配置

在pom.xml添加依赖

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

在springMVC.xml配置

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

③FileController控制器

@RequestMapping("/testUp")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
   //获取上传的文件的文件名
   String fileName = photo.getOriginalFilename();
   //获取servletContext对象,获取photo文件夹目录
   ServletContext servletContext = session.getServletContext();
   //获取photo目录的路径
   String photoPath = servletContext.getRealPath("photo");
   //判断路径是否存在,如果不存在则创建
   File file = new File((photoPath));
   if (!file.exists()){
      //不存在创建目录
      file.mkdir();
   }
   String finalPath = photoPath + File.separator + fileName;
   //文件上传
   photo.transferTo(new File(finalPath));
   return "success";
}

④处理上传文件重名的问题

切割文件名称和后缀

String prefixName = fileName.substring(0,fileName.indexOf("."));
String suffixName = fileName.substring(fileName.lastIndexOf("."));

通过UUID进行组合

fileName = prefixName+UUID.randomUUID().toString().substring(0,8)+suffixName;

完整代码

 

// 文件上传
@RequestMapping("/testUp")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
   //获取上传的文件的文件名
   String fileName = photo.getOriginalFilename();
   //重名问题,获取文件名和后缀名
   String prefixName = fileName.substring(0,fileName.indexOf("."));
   String suffixName = fileName.substring(fileName.lastIndexOf("."));
   fileName = prefixName+UUID.randomUUID().toString().substring(0,8)+suffixName;
   //获取servletContext对象,获取photo文件夹目录
   ServletContext servletContext = session.getServletContext();
   //获取photo目录的路径
   String photoPath = servletContext.getRealPath("photo");
   //判断路径是否存在,如果不存在则创建
   File file = new File((photoPath));
   if (!file.exists()){
      //不存在创建目录
      file.mkdir();
   }
   String finalPath = photoPath + File.separator + fileName;
   //文件上传
   photo.transferTo(new File(finalPath));
   return "success";
}

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

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

相关文章

思科无线AC旁挂并由第三方网关下发业务上网VLAN的案例

在企业网络环境中&#xff0c;思科无线AC&#xff08;Access Controller&#xff09;常用于无线网络的管理和控制。通常情况下&#xff0c;AC会负责分配无线设备的IP地址和VLAN标识&#xff0c;但在某些特定场景下&#xff0c;我们可能需要通过第三方网关来下发业务上网所需的V…

高频Postman接口测试面试题,我面试没通过的原因找到了

目录 一、Postman在工作中使用流程是什么样的&#xff1f; 二、你使用过Postman的哪些功能&#xff1f; 三、Postman如何管理测试环境&#xff1f; 四、Postman如何实现接口关联&#xff1f; 五、Postman参数化有哪几种方式&#xff1f; 六、Postman中全局/环境/集合变量…

Python和PHP相比有什么优势?我来聊聊深入学习的七个关键点

今天要跟大家谈一下一个高中生被Python培训机构坑的真实案例&#xff0c;披着大数据的壳子。这个高中生进去的时候&#xff0c;他们承诺不管什么学历包分配&#xff0c;毕业后直接上岗。这种承诺肯定是不靠谱的&#xff0c;因为基本上只要说出这句话的包分配&#xff0c;都是很…

如何从零开始构建 API ?

假设你请承包商从零开始建造一座房子&#xff0c;你肯定期望他们交付最高质量的房子。他们必须通过检查、遵守安全规范并遵循项目中约定的要求。因为建房子可容不得走捷径。如果承包商经常走捷径&#xff0c;他们的声誉会受到影响&#xff0c;从而失去客户。其实&#xff0c;开…

jmeter-分布式部署之负载机的设置

目录 引言 一、windows下负载机的配置&#xff08;执行机&#xff09; 二、linux下负载机的配置 三、错误总结 写在最后 引言 今天想和大家聊一下关于jmeter分布式部署中负载机的设置问题。作为一个自动化测试工具&#xff0c;jmeter在性能测试方面有着很强的优势&#x…

NLP(3) Text Classification

文章目录 OverviewText classification 的主要任务Topic ClassificationSentiment AnalysisNative Language IdentificationNatural Language Inference 如何构造 Text ClassifierClassification AlgorithmsBias - Variance Balance朴素贝叶斯Logistic RegressionSupport Vecto…

chatgpt赋能python:Python如何倒序输出:一步步教你实现

Python如何倒序输出&#xff1a;一步步教你实现 Python是一种通用编程语言&#xff0c;具有快速开发、易学易用等诸多优点&#xff0c;在大数据、人工智能、科学计算等领域得到广泛应用。其中&#xff0c;倒序输出是Python编程中非常常见的操作。那么&#xff0c;如何在Python…

STM32F407 移植 FreeRTOS

0. 实验准备 本实验是基于正点原子 STM32F407ZG 探索者开发板完成的&#xff0c;所以需要一个STM32F407ZG 探索者开发板 用于移植的基础工程&#xff08;下面会讲&#xff09; FreeRTOS源码&#xff08;下面会讲&#xff09; 1. FreeRTOS移植 1.1 移植前准备 1.1.1 基础工程…

SpringCloud Gateway网关集成与配置

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

桶装水站点APP小程序管理系统 方便快捷送水上门

夏天到了&#xff0c;又到了疯狂饮水的季节了&#xff0c;桶装饮用水是日常生活办公环境中必不可少的产品&#xff0c;这种必需品消耗快隔三差五就要购买一次。一般人都是通过电话预定的方式来购买桶装水&#xff0c;商家必须保证随时随地有人接听电话才能避免遗漏客户&#xf…

系列六、MongoDB文档相关操作

一、插入文档 1.1、单条插入 # 语法 db.集合名称.insert({json数据})# 案例 db.user.insert({"name":"张三","age":23,"birthday":"1997-07-07" }) 1.2、多条插入 # insertMany语法&#xff1a; db.collection.insertMan…

Docker 的数据管理和Dockerfile

-------------------------------------------Docker 的数据管理-------------------------------------------- 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 …

ClickHouse集群安装与部署

这是一篇关于讲解如何安装部署ClickHouse集群的参考文章&#xff0c;希望通过此&#xff0c;大家都能了解ClickHouse&#xff0c;都能学会安装配置ClickHouse以及它的使用。 什么是ClickHouse&#xff1f; ClickHouse是Yandex于2016年开源的列式存储数据库(DBMS)&#xff0c;主…

【String字符串之前篇】

目录 1.什么是字符串2.常用字符串的写法3.String字符串的底层原理3.字符串的比较3.1双等号和equals3.2 compareTo(String s) 方法3.3compareToIgnoreCase方法 4.String查找方法5.字符串的转换5.1字符串与数字转换5.2 大小写转换5.3 字符串与数组的转换 1.什么是字符串 对于&quo…

项目经理提升领导力的6个重点

1、以身作则 作为团队的领导者&#xff0c;要想更好地调动团队的积极性&#xff0c;最直接简单的方法就是以身作则&#xff0c;做团队的榜样。在要求团队成员之前&#xff0c;自己先做好&#xff0c;关键时候需身先士卒。 项目经理提升领导力的6个重点 2、共同目标 项目团队的共…

DataSecurity Plus:数字化时代的数据安全护卫者

引言&#xff1a; 在数字化时代&#xff0c;数据成为企业和个人生活中不可或缺的资产。然而&#xff0c;随之而来的是日益增长的数据安全威胁。为了保护数据的机密性、完整性和可用性&#xff0c;数据安全解决方案——DataSecurity Plus应运而生。本文将深入探讨DataSecurity …

嵌入式Android系统耳机驱动基本知识

开发项目的时候&#xff0c;接手的第一个驱动就是android平台下耳机的插拔检测和按键检测​。这部分涉及的硬件知识比较简单&#xff0c;但是软件上对中断的处理&#xff0c;软件检测的鲁棒性&#xff0c;都有比较高的要求&#xff0c;涉及到驱动开发中经常使用的中断申请&…

Linux下Python脚本的编写解析fio测试log(四)

在我们平常的测试盘的过程中,fio是一款业界最为通用的工具&#xff0c;通过Fio可以只知道一个盘具体的带宽,iops,延迟等等.比如下面这段fio的log 这里边需要拿出log里的一些参数 做成表格 如下&#xff1a; 下面说下如何用Python解析log并做成表格 1 同样是用到Python中文件…

【裸机驱动LED】使用汇编代码驱动LED(二)—— 汇编代码编写篇

上一部分我们已经整理出了所需寄存器的基地址、初始值&#xff0c;因为我们要给寄存器赋值&#xff0c;其实就是向指定地址写入内容。下面所有用到的基地址和初始化值都在上一篇总结好了。 【裸机驱动LED】使用汇编代码驱动LED&#xff08;一&#xff09;—— 寄存器解析篇_仲…

Nginx+Tomcat负载均衡,动静分离

文章目录 一.Nginx应用1.1Nginx负载均衡实现原理1.2Nginx动静分离实现原理 二.NginxTomcat负载均衡、动静分离&#xff08;七层实例&#xff09; 一.Nginx应用 Nginx是一款非常优秀的HTTP服务软件 支持高达50000个并发连接数的响应拥有强大的静态资源处理能力运行稳定内存、C…