SpringMVC 文件上传和下载
文件上传
简单介绍:
文件上传是将文件从客户端读到服务器的过程。
pom.xml
如果是使用Spring5以及之前的版本需要引入依赖。
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
文件上传表单
在文件上传之前我们需要准备一个html页面和一个表单来支持我们的文件上传。html页面采用thymeleaf
模板语法。文件上传的请求必须是post
,并且 form
表单中必须使用标签entype="multipart/form-data"
。文件上传的组件是input
,该组件type
为file
,form
表单中的action
属性用来设置请求路径。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传和下载</title>
</head>
<body>
<h1>文件上传和下载</h1>
<hr>
<h3>文件上传</h3>
<!--文件上传表单-->
<form th:action="@{/file/up}" method="post" enctype="multipart/form-data">
点我上传:<input type="file" name="fileName"/><br>
<input type="submit" value="上传">
</form>
<hr>
</body>
</html>
web.xml配置信息
Spring6
需要在web.xml
配置<multipart-config>
标签信息,当然Spring5也是需要配置信息的,但是配置方式和Spring6不同。而是在springmvc.xml文件中配置:CommonsMultipartResolver
,这个配置在Spring6中已经废弃。
<!--前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!--设置单个支持最大文件的大小 单位字节-->
<max-file-size>102400</max-file-size>
<!--设置整个表单所有文件上传的最大值-->
<max-request-size>102400</max-request-size>
<!--设置最小上传文件大小-->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
编写文件上传响应的控制类(FileController)
文件上传的原理实际上还是IO流
package com.powernode;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
@Controller
public class FileController {
// 处理文件上传请求
@RequestMapping(value = "/file/up", method = RequestMethod.POST)
public String fileup(@RequestParam("picturefile") MultipartFile file , HttpServletRequest httpServletRequest) {
// 获取上传文件的目录
File directory= new File(httpServletRequest.getServletContext().getRealPath("/upload"));
// 获取上传文件的原始文件名
String orignname = file.getOriginalFilename();
// 如果目录不存在,则创建目录
if(!directory.exists()){
directory.mkdirs();
}
try(BufferedInputStream bufferedInputStream = new BufferedInputStream(file.getInputStream());
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(directory.getAbsolutePath()+"/"+orignname))
){
// 读取文件内容,并写入到目标文件中
int count ;
byte[] bytes = new byte[1024];
while((count=bufferedInputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,count);
}
}catch (IOException e){
e.printStackTrace();
}
// 返回上传成功
return "ok";
}
}
使用UUID作为文件名,防止文件覆盖
@RequestMapping(value = "/file/up", method = RequestMethod.POST)
public String fileup(@RequestParam("picturefile") MultipartFile file , HttpServletRequest httpServletRequest) {
File directory= new File(httpServletRequest.getServletContext().getRealPath("/upload"));
String orignname = file.getOriginalFilename();
if(!directory.exists()){
directory.mkdirs();
}
try(BufferedInputStream bufferedInputStream = new BufferedInputStream(file.getInputStream());
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(
directory.getAbsolutePath()+"/"+
UUID.randomUUID().toString()+orignname.substring(orignname.lastIndexOf("."))))
){
int count ;
byte[] bytes = new byte[1024];
while((count=bufferedInputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,count);
}
}catch (IOException e){
e.printStackTrace();
}
return "ok";
}
文件下载
html部分代码:
<!--文件下载-->
<a th:href="@{/download}">文件下载</a>
controller代码:
@GetMapping("/download")
public ResponseEntity<byte[]> download(HttpServletRequest httpServletRequest) throws IOException {
//获取要下载的文件
File file = new File(httpServletRequest.getServletContext().getRealPath("/upload/10.png"));
// 创建响应头对象
HttpHeaders headers = new HttpHeaders();
// 设置响应内容类型
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 设置下载文件的名称
headers.setContentDispositionFormData("attachment", file.getName());
// 返回结果
return new ResponseEntity<>(Files.readAllBytes(file.toPath()), headers, HttpStatus.OK);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?