前文说到springMVC映射普通表单的开发方法,接下来讨论如何使用springmvc上传单个文件。
springmvc对form表单的支持已经很成熟,仅仅两步:
- 配置支持文件上传的bean:org.springframework.web.multipart.commons.CommonsMultipartResolver
同时设置文件编码、单次提交表单上传文件最大字节数、以及写文件时使用的缓冲区大小 -
开发处理:handler[org.hy.ssm.web.controller.FormController.uploadOne(MultipartFile)]
/** * @Title: uploadOne * @Description: 单文件上传 * @param file * @return ModelMap */ @RequestMapping("/uploadOne") @ResponseBody public ModelMap uploadOne(MultipartFile file) { final String UPLOAD_DIR = "/upload/"; final String KEY_OF_ORIGINAL_FILE_NAME = "origFileName"; final String KEY_OF_FILE_URL = "fileUrl"; final String KEY_OF_FILE_SUFFIX = "fileSuffix"; boolean flag = false; String message = null; Map<String, String> data = Maps.newHashMap(); // 原文件名(通常用于下载展示) String originalFilename = file.getOriginalFilename(); data.put(KEY_OF_ORIGINAL_FILE_NAME, originalFilename); // 文件类型(后缀) String suffix = FileUtil.getSuffix(originalFilename); data.put(KEY_OF_FILE_SUFFIX, suffix); // 目标文件名(通常情况需要重命名, 防止同名文件覆盖) String fileName = String.valueOf(System.currentTimeMillis()) + suffix; String fileUrl = (UPLOAD_DIR + fileName); data.put(KEY_OF_FILE_URL, fileUrl); try { File dest = WebUtil.getFile(fileUrl); file.transferTo(dest); flag = true; } catch (Exception e) { flag = false; message = ""; LOGGER.warn(message + " : " + e.getMessage(), e); } return WebUtil.getModelMap(flag, data, message); }
接下来验证结果是否正确:
- 正常验证
- 非法验证,文件大小超出。当前测试数据70+MB
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 32505856 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (79882924) exceeds the configured maximum (32505856) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:160) at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139) at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1020) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:883) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:722) Caused by: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (79882924) exceeds the configured maximum (32505856) at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:937) at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331) at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156) ... 28 more
由错误也可定位出,#multipartResolver.maxUploadSize 是用来定位单次表单提交时,文件的限定大小
到此,单文件上传已经搞定。是不是很简单呢?当然了还有稍微原始的方法,通过 org.apache.commons.fileupload.servlet.ServletFileUpload 也能实现文件上传的功能,在此不做详解。大致步骤如下:
- 获取工厂 DiskFileItemFactory
- 通过工厂获取上传组件 ServletFileUpload
- 解析请求获取表单项
- 判断表单项类型
- 解析表单项
/** * @Title: uploadByFileUpload * @Description: 使用Commons.FileUpload上传文件 */ @RequestMapping("/uploadByFileUpload") public void uploadByFileUpload() { final String UPLOAD_DIR = "upload/"; final String basePath = WebUtil.getBaseFilPath(); HttpServletRequest request = WebUtil.getRequest(); try { // 防止中文名乱码 request.setCharacterEncoding("utf-8"); // 1. 获取工厂 DiskFileItemFactory DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); // 缓存区目录 fileItemFactory.setRepository(new File(basePath + "tmp/")); // 缓存区大小 fileItemFactory.setSizeThreshold(1024 * 6); // 2. 通过工厂获取上传组件 ServletFileUpload ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); // 设置文件的大小为2M servletFileUpload.setSizeMax(1024 * 1024 * 2); // 防止中文乱码(文件名) servletFileUpload.setHeaderEncoding("UTF-8"); // 3. 解析请求获取表单项 @SuppressWarnings("unchecked") List<FileItem> items = servletFileUpload.parseRequest(request); // 4. 判断表单项类型 for (FileItem item : items) { // 5. 解析表单项 // 表单项名称 String fieldName = item.getFieldName(); if (item.isFormField()) { // 普通表单项处理 String name = fieldName; String value = item.getString("UTF-8"); System.out.println(name + ":" + value); } else { // 文件表单项 // 获取文件名 String originalFileName = item.getName(); String suffix = FileUtil.getSuffix(originalFileName); String newFileName = String.valueOf(System.currentTimeMillis()); // 写入文件 String fileName = File.separator + newFileName + suffix; File newFile = FileUtil.createQuietly(basePath + UPLOAD_DIR + fileName); item.write(newFile); item.delete(); } } } catch (Exception e) { LOGGER.warn(e.getMessage(), e); } }
注意:如果使用上面的方式获取上传文件,需要停止 springmvc 的文件解析机制,否则将不能获取数据 !!
源码下载:ssmFU.zip
相关推荐
在Spring MVC框架中,表单提交是Web应用中常见的功能之一,特别是在处理用户上传文件时。本篇将详细探讨如何实现多文件上传表单的功能,同时也会涉及到一些相关的源码和工具使用。 首先,让我们从基础开始。Spring ...
在本文中,我们将深入探讨Spring MVC框架中的表单提交,主要关注如何处理普通的HTML表单。Spring MVC是Java开发Web应用程序的一个强大工具,它提供了一种优雅的方式来处理HTTP请求,特别是表单数据的提交。 首先,`...
《Spring In Action: SpringMVC 提交表单详解》 在Web开发中,SpringMVC作为Spring框架的一部分,是处理HTTP请求和响应的强大工具。它为开发者提供了构建高性能、易于测试的Web应用程序的结构。本篇文章将深入探讨...
在这个“SpringMVC文件上传,多文件上传实例”中,我们将深入探讨如何在SpringMVC环境中实现文件上传功能,包括单个文件上传以及多个文件的批量上传。 1. **文件上传原理**: 文件上传是通过HTTP协议的POST请求来...
本文将详细讲解如何实现SpringMVC中的单文件上传、多文件上传、文件列表显示以及文件下载。 首先,我们需要理解SpringMVC处理文件上传的基本原理。在SpringMVC中,文件上传通常涉及到`CommonsMultipartResolver`...
- 用户填写完表单并提交后,Spring MVC会自动将表单数据绑定到相应的POJO对象中。在Controller中,可以通过方法参数来接收这些数据。例如,可以定义一个接受`MyPojo`类型参数的方法来处理提交的数据。 ```java @...
在SpringMVC中实现文件上传是一项常见的任务,它允许用户通过表单将本地文件发送到服务器进行存储或处理。这个"SpringMVC文件上传Demo代码"是一个实例,演示了如何配置和使用SpringMVC来实现这一功能。 首先,我们...
在SpringMVC框架中,实现文件的上传与下载是常见的需求。IntelliJ IDEA作为流行的Java开发集成环境,为开发者提供了高效便捷的开发体验。在这个项目中,我们使用IDEA来构建一个基于SpringMVC的系统,实现了文件的...
总之,这个"springMVC文件上传demo"提供了一个完整的文件上传解决方案,包括前端表单、后端控制器、异常处理以及必要的配置。通过学习和实践这个Demo,开发者可以快速掌握SpringMVC环境下文件上传的实现方式。
在这个项目中,我们将深入探讨如何使用Spring MVC作为后端控制器来处理文件上传,以及Vue.js在前端如何与之配合。 首先,我们需要在Spring MVC的Controller层创建一个方法来接收文件。这个方法通常会使用`@...
SpringMVC 上传文件详解 SpringMVC 框架中上传文件是非常常见的操作,今天我们来详细讲解 SpringMVC 中的文件上传过程。 文件上传的必要条件 在 SpringMVC 中,文件上传需要满足以下几个条件: 1. 表单的 ...
当文件与表单数据一起提交时,可以使用`@ModelAttribute`注解。首先,创建一个Java类来封装文件和其他字段: ```java public class FileUploadForm { private MultipartFile file; // getter & setter } ```...
在Spring MVC框架中,文件上传是一项常见的功能,用于接收用户通过表单提交的文件数据。本项目"springmvc文件上传练习项目"旨在提供一个实践平台,帮助开发者掌握如何使用Spring MVC处理Multipart类型的请求,实现...
为了能够提交文件,前端HTML表单需要设置正确的`enctype`属性为`multipart/form-data`,这样才能正确地发送文件数据。同时,表单的提交方式应该设置为`POST`。 ```html <form action="/upload" method="post" ...
在Spring MVC框架中,文件上传是一项常见的功能,用于接收用户通过表单提交的文件数据。本案例将深入探讨如何在Spring MVC中实现文件上传,并提供关键知识点和步骤。 首先,理解Spring MVC的基本工作原理至关重要。...
在SpringMVC中实现文件上传是一项常见的任务,它涉及到HTTP协议、多部分表单数据处理以及服务器端的文件存储策略。下面将详细阐述如何在SpringMVC中进行文件上传,并涵盖相关知识点。 1. **MultipartFile接口** ...
2. **通过表单提交文件** - **前端**:创建一个HTML表单,包含一个`<input type="file">`元素,用户选择文件后,提交表单。例如: ```html <form action="/upload" method="post" enctype="multipart/form-data">...
本主题将深入探讨如何使用SpringMVC和SSH(Struts2 + Hibernate + Spring)框架来实现文件的上传与下载。 首先,我们来看SpringMVC中的文件上传。SpringMVC是Spring框架的一部分,它提供了强大的MVC设计模式支持,...