文件上传与下载是Web应用开发中常用的功能之一。接下来我们将讨论如何在Spring Boot的Web应用开发中,如何实现文件的上传与下载。

01、Spring Boot文件上传与下载

在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设置为multipart/form-data。只有这种设置,浏览器才能将所选文件的二进制数据发送给服务器。

从Servlet 3.0开始,就提供了处理文件上传的方法,但这种文件上传需要在Java Servlet中完成,而Spring MVC提供了更简单的封装。Spring MVC是通过Apache Commons FileUpload技术实现一个MultipartResolver的实现类CommonsMultipartResolver完成文件上传的。因此,Spring MVC的文件上传需要依赖Apache Commons FileUpload组件。

Spring MVC将上传文件自动绑定到MultipartFile对象中,MultipartFile提供了获取上传文件内容、文件名等方法,并通过transferTo方法将文件上传到服务器的磁盘中,MultipartFile的常用方法如下:

byte[] getBytes():获取文件数据。

● String getContentType():获取文件MIME类型,如image/jpeg等。

● InputStream getInputStream():获取文件流。

● String getName():获取表单中文件组件的名字。

● String getOriginalFilename():获取上传文件的原名。

● long getSize():获取文件的字节大小,单位为byte。

● boolean isEmpty():是否有(选择)上传文件。

● void transferTo(File dest):将上传文件保存到一个目标文件中。

Spring Boot的spring-boot-starter-web已经集成了Spring MVC,所以使用Spring Boot实现文件上传,更加便捷,只需要引入Apache Commons FileUpload组件依赖即可。

02、举例说明

下面通过一个实例讲解Spring Boot文件上传与下载的实现过程。

【例7】Spring Boot文件上传与下载。

具体实现步骤如下。

1引入Apache Commons FileUpload组件依赖

在Web应用ch7_2的pom.xml文件中,添加Apache Commons FileUpload组件依赖,具体代码如下:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><!-- 由于commons-fileupload组件不属于Spring Boot,所以需要加上版本 --><version>1.4</version>
</dependency>

2设置上传文件大小限制

在Web应用ch7_2的配置文件application.properties中,添加如下配置进行限制上传文件大小。

#上传文件时,默认单个上传文件大小是1MB,max-file-size设置单个上传文件大小
spring.servlet.multipart.max-file-size=50MB
#默认总文件大小是10MB,max-request-size设置总上传文件大小
spring.servlet.multipart.max-request-size=500MB

3创建选择文件视图页面

在ch7_2应用的src/main/resources/templates目录下,创建选择文件视图页面uploadFile.html。该页面中有个enctype属性值为multipart/form-data的form表单,具体代码如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
<!-- 默认访问 src/main/resources/static下的css文件夹-->
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" />
</head>
<body>
<div class="panel panel-primary"><div class="panel-heading"><h3 class="panel-title">文件上传示例</h3></div></div><div class="container"><div class="row"><div class="col-md-6 col-sm-6"><form class="form-horizontal" action="upload"
method="post" enctype="multipart/form-data"><div class="form-group"><div class="input-group col-md-6"><span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span><input class="form-control" type="text"name="description" th:placeholder="文件描述"/></div></div><div class="form-group"><div class="input-group col-md-6"><span class="input-group-addon"><i class="glyphicon glyphicon-search"></i></span><input class="form-control" type="file"name="myfile" th:placeholder="请选择文件"/></div></div><div class="form-group"><div class="col-md-6"><div class="btn-group btn-group-justified"><div class="btn-group"><button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-share"></span>&nbsp;上传文件</button></div></div></div></div></form></div></div></div>
</body>
</html>

4创建控制器

在ch7_2应用的com.ch.ch7_2.controller包中,创建控制器类TestFileUpload。在该类中有4个处理方法,一个是界面导航方法uploadFile,一个是实现文件上传的upload方法,一个是显示将要被下载文件的showDownLoad方法,一个是实现下载功能的download方法。核心代码如下:

@Controller
public class TestFileUpload {@RequestMapping("/uploadFile")public String uploadFile() {return "uploadFile";}/*** 上传文件自动绑定到MultipartFile对象中,* 在这里使用处理方法的形参接收请求参数。*/@RequestMapping("/upload")public String upload(HttpServletRequest request,@RequestParam("description") String description,@RequestParam("myfile") MultipartFile myfile)
throws IllegalStateException, IOException {System.out.println("文件描述:" + description);//如果选择了上传文件,将文件上传到指定的目录uploadFilesif(!myfile.isEmpty()) {//上传文件路径String path = request.getServletContext().getRealPath("/uploadFiles/");//获得上传文件原名String fileName = myfile.getOriginalFilename();File filePath = new File(path + File.separator + fileName);//如果文件目录不存在,创建目录if(!filePath.getParentFile().exists()) {filePath.getParentFile().mkdirs();}//将上传文件保存到一个目标文件中myfile.transferTo(filePath);}//转发到一个请求处理方法,查询将要下载的文件return "forward:/showDownLoad";}/*** 显示要下载的文件*/@RequestMapping("/showDownLoad")public String showDownLoad(HttpServletRequest request, Model model) {String path = request.getServletContext().getRealPath("/uploadFiles/");File fileDir = new File(path);//从指定目录获得文件列表File filesList[] = fileDir.listFiles();model.addAttribute("filesList", filesList);return "showFile";}/*** 实现下载功能*/@RequestMapping("/download")public ResponseEntity<byte[]> download(HttpServletRequest request,@RequestParam("filename") String filename,@RequestHeader("User-Agent") String userAgent) throws IOException {//下载文件路径String path = request.getServletContext().getRealPath("/uploadFiles/");//构建将要下载的文件对象File downFile = new File(path + File.separator + filename);//ok表示HTTP中的状态是200BodyBuilder builder = ResponseEntity.ok();//内容长度builder.contentLength(downFile.length());//application/octet-stream:二进制流数据(最常见的文件下载)builder.contentType(MediaType.APPLICATION_OCTET_STREAM);//使用URLEncoder.encode对文件名进行编码filename = URLEncoder.encode(filename,"UTF-8");/*** 设置实际的响应文件名,告诉浏览器文件要用于“下载”和“保存”。* 不同的浏览器,处理方式不同,根据浏览器的实际情况区别对待。*/if(userAgent.indexOf("MSIE") > 0) {//IE浏览器,只需要用UTF-8字符集进行URL编码builder.header("Content-Disposition", "attachment; filename=" + filename);}else {/**非IE浏览器,如FireFox、Chrome等浏览器,则需要说明编码的字符集* filename后面有个*号,在UTF-8后面有两个单引号*/builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);}return builder.body(FileUtils.readFileToByteArray(downFile));}
}

5创建文件下载视图页面

在ch7_2应用的src/main/resources/templates目录下,创建文件下载视图页面showFile.html。核心代码如下:

<body><div class="panel panel-primary"><div class="panel-heading"><h3 class="panel-title">文件下载示例</h3></div></div><div class="container"><div class="panel panel-primary"><div class="panel-heading"><h3 class="panel-title">文件列表</h3></div><div class="panel-body"><div class="table table-responsive"><table class="table table-bordered table-hover"><tbody class="text-center"><tr th:each="file,fileStat:${filesList}"><td><span th:text="${fileStat.count}"></span></td><td><!--file.name相当于调用getName()方法获得文件名称 --><a th:href="@{download(filename=${file.name})}"><span th:text="${file.name}"></span></a></td></tr></tbody></table></div></div></div></div>
</body>

6运行

首先,运行Ch72Application主类。然后,访问http://localhost:8080/ch7_2/uploadFile测试文件上传与下载。

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

全栈开发实战|Spring Boot文件上传与下载相关推荐

  1. vueform表单文件上传_峰哥说技术系列-8.Spring Boot文件上传(Form表单和Ajax方式)

    今日份主题 Spring Boot文件上传(Form表单和Ajax方式) 在Spring Boot中,和文件上传的主要和MultipartResolver接口有关,他有两个实现类 StandardSe ...

  2. Spring Boot文件上传及回显(单/多文件)

    一.单文件上传 1.前端页面 <!DOCTYPE html> <html lang="en"> <head><meta charset=& ...

  3. Spring Boot 文件上传后端获取为null

    前言 今天学习使用springboot实现文件上传与下载功能,在实现文件上传的时候代码都没问题,但是每次提交后端都包空指针异常,最后发现获取的file为null. 先看代码 前端代码 <!DOC ...

  4. Spring MVC,Spring Boot文件上传

    在传统的ssm项目开发时,如果用到文件上传,一般是在xml配置文件中,定义bean, <bean id="multipartResolver" class="org ...

  5. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  6. Spring Boot文件上传示例

    一.创建一个简单的包含WEB依赖的SpringBoot项目 pom.xml内容: <!-- Spring Boot web启动器 --> <dependency><gro ...

  7. Spring Boot 文件上传

    其实网上已经有很多这样的文章了.为什么我还要记录一下呢?原因是在工作中对接外系统时,碰到了他们调取我们文件上传接口确存在着http请求头部规范的情况,从而导致用传统方法获取不到参数.今天就来整理下Sp ...

  8. Spring Boot教程(十三):Spring Boot文件上传

    分享一个零基础,通俗易懂,而且非常风趣幽默的人工智能教程(如不能直接点击访问,请以"右键"->"在新标签页中打开链接"方式打开)网站,网址:https:/ ...

  9. Spring Boot文件上传

    一.创建一个简单的包含WEB依赖的SpringBoot项目 二.配置文件上传的文件大小限制 # 上传文件总的最大值 spring.servlet.multipart.max-request-size= ...

最新文章

  1. html css百分比效果,css百分比不起作用是什么原因?
  2. leetcode 136. Single Number
  3. Ubuntu NEF to JPEG(Linux NEF 原生格式转jpeg)
  4. fedora desktop
  5. Java多线程安全问题解决的两种方式代码案例
  6. 10年老兵!从大学毕业生到嵌入式系统工程师的修炼之道……
  7. 前端学习(2380):调整目录结构
  8. python99乘法表while翻译_Python学习之while练习--九九乘法表
  9. cmd在执行hadoop version时出现系统找不到指定的路径。 Error: JAVA_HOME is incorrectly set
  10. 常见图片格式:PNG,JPG/JPEG,BMP
  11. docker知识点查阅
  12. BZOJ 1078: [SCOI2008]斜堆
  13. 关于Android 微信APP支付开发中遇到的问题
  14. 如何下载大同市卫星地图高清版大图
  15. PHP生成订单号算法
  16. html导出excel
  17. 20230214不是情人的情人节
  18. c语言定义禁止优化变量,c语言防止优化
  19. H5及微信小程序实测可用——监听手机返回键操作
  20. springboot打包docker镜像部署

热门文章

  1. 科大讯飞的Chatgpt?
  2. 职业教育标准教材·计算机组装与维修,中等职业教育计算机专业系列教材:计算机组装与维护...
  3. database disk image is malformed
  4. Xamarin Forms Custom Expander
  5. 浙大研修笔记(五):国学智慧与领导者修炼
  6. 实战|网站监控如何做好监测点管理与内网数据采集
  7. 时间序列(time serie)分析系列之LSTM(多步)预测5
  8. 报表FCRA考试题集及答案(错了11题)
  9. 49-Linux_malloc及4G虚拟空间分布
  10. 日记侠:如何优化你的微信头像?