Spring MVC Multiple File Upload example

本文详细介绍了如何使用 Spring MVC 实现多文件上传的功能,包括前端表单的构造、后端接收处理以及文件保存的具体步骤。通过示例代码,深入理解 Spring MVC 中的文件上传机制。
[size=medium][color=blue][url]http://viralpatel.net/blogs/spring-mvc-multiple-file-upload-example/[/url][/color][/size]

[size=medium][color=blue][url]http://www.mkyong.com/spring-mvc/spring-mvc-file-upload-example/[/url][/color][/size]
创建Web项目,导入相关JAR包; <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> 创建并配置web.xml文件; <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>Springmvc</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> </servlet> <servlet-mapping> <servlet-name>Springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> 添加用于上传的jsp页面; <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <title>文件上传</title> </head> <body> <table border="1"> <tr> <td width="500" align="center">文件上传</td> </tr> <tr> <td> <form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data"> <input type="file" name="uploadfiles" multiple="multiple"/><br> <input type="submit" value="上传"><br> </form> </td> </tr> <c:forEach items="${msgs}" var="msg"> <tr><td align="center" colspan="2" style="color: red">${msg}</td></tr> </c:forEach> </table> </body> </html> 创建控制类用于上传文件; package com.springmvc.controller; import java.io.File; import java.io.IOException; import java.util.ArrayList; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping("/file") public class FileUploadController { @RequestMapping("/upload") public String fileUpload(ArrayList<MultipartFile> uploadfiles, HttpServletRequest request) { //定义列表msgs保存提示信息 ArrayList<String> msgs = new ArrayList<>(); if (uploadfiles.get(0).getSize() > 0) { //判断是否上传文件 for (MultipartFile file : uploadfiles) { //循环获取文件 //判断文件不为空且大小大于0 if (!file.isEmpty() & file.getSize() > 0) { //获取文件原始名称 String originalFilename = file.getOriginalFilename(); //获取服务器中的文件夹路径 String path = request.getServletContext().getRealPath("/upload/"); //设置文件保存到服务器的目标路径 String filePath = path + originalFilename; try { //保存文件内容到目标路径 file.transferTo(new File(filePath)); } catch (IOException e) { msgs.add(filePath + "保存失败"); } msgs.add(filePath +"保存成功"); } } } else msgs.add("上传文件失败"); request.setAttribute("msgs", msgs); return "fileUpload"; } } 添加配置文件; <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.springmvc.controller"/> <mvc:annotation-driven /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--配置视图控制器,指定文件上传页面的映射路径--> <mvc:view-controller path="/file/fileupload" view-name="fileUpload"/> <mvc:view-controller path="/file/filedownload" view-name="fileDownload"/> <!--配置注解驱动--> <mvc:annotation-driven/> <!--配置文件上传解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--指定请求的编码方式--> <property name="defaultEncoding" value="UTF-8"></property> <!--指定允许上传文件的大小,此处设置最大值为1 M,单位为字节--> <property name="maxUploadSize" value="1024000"></property> </bean> </beans> 添加上传成功的消息页面。 文件下载: 创建控制器类: package com.springmvc.controller; import java.io.File; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/file") public class FileDownloadController { @RequestMapping("/download") public ResponseEntity<byte[]> FileDownload(HttpServletRequest request, String fileName) throws IOException { //获取下载文件的路径 String filepath = request.getServletContext().getRealPath("/upload/") + fileName; //创建该文件的对象 File file = new File(filepath); //将文件读取到字节数组中 byte[] bytes = FileUtils.readFileToByteArray(file); //创建HttpHeaders对象设置响应头信息 HttpHeaders headers = new HttpHeaders(); //设置浏览器以“UTF-8”编码方式显示文件名 fileName = URLEncoder.encode(fileName, "UTF-8"); //设置以下载的方式打开文件,并指定文件名称 headers.setContentDispositionFormData("attachment", fileName); //设置文件的下载方式为二进制流 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<>(bytes, headers, HttpStatus.OK); } } 添加用于上传的jsp页面; <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>文件下载</title> </head> <body> <table border="1"> <tr> <td width="350" align="center">下载列表</td> </tr> <tr> <td> <a href="${pageContext.request.contextPath}/file/download?fileName=微信图片_20250612231528.jpg"> 这是一张图片</a><br> </td> </tr> </table> </body> </html> 实验成果: 修改一下
最新发布
11-01
<think>首先,用户的问题是关于修改一个Spring MVC Web项目,该项目涉及文件上传和下载功能。关键元素包括:创建Web项目、导入JAR包(commons-fileupload-1.3.1 和 commons-io-2.4)、配置web.xml、添加JSP页面、创建控制类(FileUploadController 和 FileDownloadController)、添加SpringMVC.xml配置文件。 用户引用了站内引用[1],它简要描述了文件上传和下载的实现步骤,但我应该参考用户上一次的问题和我的回答。回顾对话历史: - 系统级指令强调了格式要求:行内数学表达式用$...$,独立公式用$$...$$,使用中文回答,生成相关问题等。 - 用户的消息是:"我想修改一个包含文件上传和下载功能的Spring MVC Web项目的代码..." 这是用户的当前查询。 - 在之前的对话中,我没有看到用户上一次的问题;这可能是一个新对话,或者系统指令是初始设置。用户提到了"参考用户上一次的问题和你的回答",但在这个上下文中,似乎没有上一次对话。用户说:"上述引用仅供参考",并指向引用[1],所以我会基于引用和用户描述来回答。 用户的需求是修改代码,所以我需要提供指导如何修改这个项目。参考引用[1],它描述了实现步骤:配置解析器、表单创建、请求处理、文件存储、文件准备、响应构建等。 我的回答必须: - 使用中文。 - 结构清晰,逐步解决问题。 - 保证真实可靠。 - 在回答中自然地添加引用标示,如果引用内容。 - 生成相关问题。 - 符合LaTeX语法:行内数学用$...$,独立公式用$$...$$。 由于主题是文件上传下载,可能涉及较少数学表达式,但如果有数学部分,我需要正确格式化。例如,如果提到文件大小限制或其他数字参数,我可以使用行内数学。 步骤来回答: 1. **理解修改需求**:用户说"修改"项目代码,但没有指定修改什么。引用[1]描述了实现,所以用户可能想修改现有代码以改进或修复问题。或许用户想基于引用更新代码。我会假设用户需要指导如何实现或修改这些功能。 2. **结构回答**:回答应该结构清晰。我可以分部分: - 项目设置回顾。 - 文件上传实现修改。 - 文件下载实现修改。 - 配置文件修改。 3. **生成相关问题**:在末尾添加§§相关问题§§部分,列出3个相关问题。 4. **添加引用**:引用[1]是给定的,所以我需要在回答中自然地添加引用标示。例如,在描述步骤时引用它。 5. **具体步骤**: - **导入JAR包**:确保commons-fileupload和commons-io JARs在类路径中。 - **配置web.xml**:添加Spring MVC DispatcherServlet配置。 - **SpringMVC.xml配置**:配置MultipartResolver用于文件上传。 - **JSP页面**:创建上传表单和下载链接的页面。 - **控制类**:实现FileUploadController处理上传,FileDownloadController处理下载。 基于引用[1]: - 文件上传:配置解析器(MultipartResolver)、创建表单(enctype="multipart/form-data")、处理请求(使用@RequestParam MultipartFile)、存储文件。 - 文件下载:准备文件路径、构建响应(设置Content-Type, Content-Disposition)、读取文件、关闭流。 我会将这些融入回答。 使用中文回答。 最后,生成相关问题。 大纲回答: 1. **引言**:概述修改项目代码的步骤。 2. **项目设置修改**: - 确保Web项目已创建。 - 导入JAR包:commons-fileupload-1.3.1.jar和commons-io-2.4.jar。 3. **配置文件修改**: - web.xml配置DispatcherServlet和映射。 - SpringMVC.xml配置MultipartResolver。 4. **JSP页面修改**: - 添加上传页面(upload.jsp)和下载页面(download.jsp)。 5. **控制类修改**: - FileUploadController:处理文件上传。 - FileDownloadController:处理文件下载。 6. **实现细节**:基于引用描述关键步骤。 7. **相关问题**。 添加引用标示:在引用内容末尾添加[^1]。 例如:"...如引用所述[^1]". </think>以下是针对您需求的详细指导,我将逐步解释如何修改您的Spring MVC Web项目代码,以实现文件上传和下载功能。您的描述涉及创建Web项目、导入JAR包、配置web.xml、添加JSP页面、创建控制类(FileUploadController 和 FileDownloadController)以及配置SpringMVC.xml文件。我将基于Apache Commons FileUpload库(如引用[1]所述)提供具体代码修改建议,确保内容真实可靠。所有步骤使用中文,并遵循Spring MVC最佳实践。如果您已有部分代码,可以将这些修改点集成到现有项目中。 ### 1. **项目设置回顾与JAR包导入** 修改前,确保您的项目是一个标准的Spring MVC Web项目(如使用Maven或手动创建)。关键步骤包括导入必要的JAR包: - **导入JAR包**:将 `commons-fileupload-1.3.1.jar` 和 `commons-io-2.4.jar` 添加到项目的类路径中(例如,在Maven项目的`pom.xml`中添加依赖)。这确保Spring能使用Apache Commons库处理文件操作。引用中提到这些库是核心依赖[^1]。 - 如果使用Maven,在`pom.xml`中添加: ```xml <dependencies> <!-- Commons FileUpload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <!-- Commons IO --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- Spring MVC依赖(确保已包含) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.18</version> <!-- 根据您的Spring版本调整 --> </dependency> </dependencies> ``` ### 2. **配置文件修改:web.xml 和 SpringMVC.xml** 这些配置文件是Spring MVC的核心,需要确保正确配置DispatcherServlet和文件上传解析器。 - **修改web.xml**:添加Spring MVC的DispatcherServlet配置,并设置URL映射。文件上传功能需要支持multipart请求。 ```xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/SpringMVC.xml</param-value> <!-- 指向Spring配置文件 --> </init-param> <load-on-startup>1</load-on-startup> <!-- 启用multipart支持以处理文件上传 --> <multipart-config> <max-file-size>10485760</max-file-size> <!-- 限制文件大小为10MB --> <max-request-size>20971520</max-request-size> <!-- 限制请求大小为20MB --> <file-size-threshold>5242880</file-size-threshold> <!-- 文件写入阈值5MB --> </multipart-config> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> <!-- 所有请求由Spring MVC处理 --> </servlet-mapping> </web-app> ``` - **修改SpringMVC.xml**:配置MultipartResolver解析器,用于处理文件上传请求。引用中强调了解析器的关键作用[^1]。添加视图解析器和扫描控制类。 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 扫描控制类包 --> <context:component-scan base-package="com.example.controller" /> <!-- 替换为您的包名 --> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <!-- JSP页面路径 --> <property name="suffix" value=".jsp" /> </bean> <!-- 配置MultipartResolver,用于文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760" /> <!-- 最大上传大小10MB --> <property name="defaultEncoding" value="UTF-8" /> <!-- 编码设置 --> </bean> <!-- 启用Spring MVC注解驱动 --> <mvc:annotation-driven /> <!-- 静态资源处理 --> <mvc:resources mapping="/resources/**" location="/resources/" /> </beans> ``` ### 3. **添加JSP页面修改** 上传和下载功能需要前端页面。创建或修改以下JSP文件: - **上传页面(upload.jsp)**:添加表单,指定`enctype="multipart/form-data"`以支持文件上传。 ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件上传</title> </head> <body> <h2>上传文件</h2> <form action="/upload" method="post" enctype="multipart/form-data"> <!-- 映射到FileUploadController --> <input type="file" name="file" /> <!-- 文件输入控件 --> <input type="submit" value="上传" /> </form> <p><a href="/download">转到下载页面</a></p> <!-- 链接到下载页面 --> </body> </html> ``` - **下载页面(download.jsp)**:提供一个文件列表供用户下载。 ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件下载</title> </head> <body> <h2>下载文件</h2> <ul> <c:forEach items="${files}" var="file"> <!-- files是控制器传递的文件列表 --> <li><a href="/download?filename=${file}">${file}</a></li> <!-- 映射到FileDownloadController --> </c:forEach> </ul> <p><a href="/">返回上传页面</a></p> </body> </html> ``` ### 4. **修改控制类:FileUploadController 和 FileDownloadController** 控制类处理业务逻辑。以下是完整示例代码(替换包名和路径)。 - **FileUploadController(处理上传)**:使用`@RequestParam MultipartFile`接收文件,并保存到服务器。引用中提到文件存储是上传过程的关键步骤[^1]。 ```java package com.example.controller; // 替换为您的包名 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @Controller public class FileUploadController { private static final String UPLOAD_DIR = "uploads/"; // 文件存储目录 @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) { if (file.isEmpty()) { redirectAttributes.addFlashAttribute("message", "请选择文件!"); return "redirect:/"; // 重定向到上传页面 } try { // 创建上传目录(如果不存在) Path uploadPath = Paths.get(UPLOAD_DIR); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } // 保存文件 String filename = file.getOriginalFilename(); Path filePath = uploadPath.resolve(filename); file.transferTo(filePath.toFile()); redirectAttributes.addFlashAttribute("message", "文件上传成功: " + filename); } catch (IOException e) { e.printStackTrace(); redirectAttributes.addFlashAttribute("message", "上传失败: " + e.getMessage()); } return "redirect:/"; // 重定向到上传页面 } } ``` - **FileDownloadController(处理下载)**:准备文件路径并构建响应,支持文件下载。引用中详细描述了响应构建和流关闭步骤[^1]。 ```java package com.example.controller; // 替换为您的包名 import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; @Controller public class FileDownloadController { private static final String DOWNLOAD_DIR = "uploads/"; // 与上传目录一致 @GetMapping("/download") public String listFiles(Model model) { try { Path dirPath = Paths.get(DOWNLOAD_DIR); List<String> files = Files.list(dirPath) .map(path -> path.getFileName().toString()) .collect(Collectors.toList()); model.addAttribute("files", files); // 传递文件列表到JSP } catch (IOException e) { e.printStackTrace(); model.addAttribute("error", "无法列出文件"); } return "download"; // 指向download.jsp视图 } @GetMapping("/download/file") public ResponseEntity<Resource> downloadFile(@RequestParam("filename") String filename) { try { Path filePath = Paths.get(DOWNLOAD_DIR).resolve(filename).normalize(); Resource resource = new UrlResource(filePath.toUri()); if (resource.exists() && resource.isReadable()) { // 设置响应头 return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); } else { return ResponseEntity.notFound().build(); } } catch (Exception e) { return ResponseEntity.internalServerError().build(); } } } ``` ### 5. **关键修改点总结** - **性能优化**:设置文件大小限制(如web.xml中的`max-file-size`)避免服务器过载。引用中提到的文件存储路径应确保可写权限[^1]。 - **错误处理**:在控制类中添加异常捕捉(如IOException),避免应用崩溃。 - **测试建议**:使用Postman或浏览器测试上传和下载功能。上传文件后,检查`uploads/`目录;下载时,确保URL映射正确。 ### 注意事项 - 文件路径使用相对路径(如`uploads/`),在生产环境中,建议使用绝对路径或外部存储(如AWS S3)。 - Commons FileUpload版本(1.3.1)兼容Spring MVC 4.x+,但确保依赖无冲突。 - 如果项目已存在部分代码,重点修改控制类逻辑和配置文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值