`

SpringMVC之表单提交===②===单文件上传表单

阅读更多

前文说到springMVC映射普通表单的开发方法,接下来讨论如何使用springmvc上传单个文件。

 

springmvc对form表单的支持已经很成熟,仅仅两步:

  1. 配置支持文件上传的bean:org.springframework.web.multipart.commons.CommonsMultipartResolver

      同时设置文件编码、单次提交表单上传文件最大字节数、以及写文件时使用的缓冲区大小
  2. 开发处理: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 也能实现文件上传的功能,在此不做详解。大致步骤如下:

  1. 获取工厂 DiskFileItemFactory
  2. 通过工厂获取上传组件 ServletFileUpload
  3. 解析请求获取表单项
  4. 判断表单项类型
  5. 解析表单项
	/**
	 * @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

  • 大小: 64.4 KB
  • 大小: 71 KB
  • 大小: 24.1 KB
  • 大小: 56.3 KB
0
1
分享到:
评论

相关推荐

    SpringMVC之表单提交===③===多文件上传表单

    在Spring MVC框架中,表单提交是Web应用中常见的功能之一,特别是在处理用户上传文件时。本篇将详细探讨如何实现多文件上传表单的功能,同时也会涉及到一些相关的源码和工具使用。 首先,让我们从基础开始。Spring ...

    SpringMVC之表单提交===①===普通表单

    在本文中,我们将深入探讨Spring MVC框架中的表单提交,主要关注如何处理普通的HTML表单。Spring MVC是Java开发Web应用程序的一个强大工具,它提供了一种优雅的方式来处理HTTP请求,特别是表单数据的提交。 首先,`...

    Spring In Action SpringMVC 提交表单

    《Spring In Action: SpringMVC 提交表单详解》 在Web开发中,SpringMVC作为Spring框架的一部分,是处理HTTP请求和响应的强大工具。它为开发者提供了构建高性能、易于测试的Web应用程序的结构。本篇文章将深入探讨...

    SpringMVC文件上传,多文件上传实例

    在这个“SpringMVC文件上传,多文件上传实例”中,我们将深入探讨如何在SpringMVC环境中实现文件上传功能,包括单个文件上传以及多个文件的批量上传。 1. **文件上传原理**: 文件上传是通过HTTP协议的POST请求来...

    SpringMVC单文件上传、多文件上传、文件列表显示、文件下载

    本文将详细讲解如何实现SpringMVC中的单文件上传、多文件上传、文件列表显示以及文件下载。 首先,我们需要理解SpringMVC处理文件上传的基本原理。在SpringMVC中,文件上传通常涉及到`CommonsMultipartResolver`...

    springmvc-form表单的使用

    - 用户填写完表单并提交后,Spring MVC会自动将表单数据绑定到相应的POJO对象中。在Controller中,可以通过方法参数来接收这些数据。例如,可以定义一个接受`MyPojo`类型参数的方法来处理提交的数据。 ```java @...

    SpringMVC文件上传Demo代码

    在SpringMVC中实现文件上传是一项常见的任务,它允许用户通过表单将本地文件发送到服务器进行存储或处理。这个"SpringMVC文件上传Demo代码"是一个实例,演示了如何配置和使用SpringMVC来实现这一功能。 首先,我们...

    IDEA SpringMVC 实现文件的上传下载

    在SpringMVC框架中,实现文件的上传与下载是常见的需求。IntelliJ IDEA作为流行的Java开发集成环境,为开发者提供了高效便捷的开发体验。在这个项目中,我们使用IDEA来构建一个基于SpringMVC的系统,实现了文件的...

    springMVC文件上传demo(亲测有效)

    总之,这个"springMVC文件上传demo"提供了一个完整的文件上传解决方案,包括前端表单、后端控制器、异常处理以及必要的配置。通过学习和实践这个Demo,开发者可以快速掌握SpringMVC环境下文件上传的实现方式。

    springmvc上传文件controller,vue

    在这个项目中,我们将深入探讨如何使用Spring MVC作为后端控制器来处理文件上传,以及Vue.js在前端如何与之配合。 首先,我们需要在Spring MVC的Controller层创建一个方法来接收文件。这个方法通常会使用`@...

    Springmvc上传文件.docx

    SpringMVC 上传文件详解 SpringMVC 框架中上传文件是非常常见的操作,今天我们来详细讲解 SpringMVC 中的文件上传过程。 文件上传的必要条件 在 SpringMVC 中,文件上传需要满足以下几个条件: 1. 表单的 ...

    SpringMVC上传文件的四种方法

    当文件与表单数据一起提交时,可以使用`@ModelAttribute`注解。首先,创建一个Java类来封装文件和其他字段: ```java public class FileUploadForm { private MultipartFile file; // getter & setter } ```...

    springmvc文件上传练习项目

    在Spring MVC框架中,文件上传是一项常见的功能,用于接收用户通过表单提交的文件数据。本项目"springmvc文件上传练习项目"旨在提供一个实践平台,帮助开发者掌握如何使用Spring MVC处理Multipart类型的请求,实现...

    Spring下的子框架SpringMVC实现单个文件上传功能

    为了能够提交文件,前端HTML表单需要设置正确的`enctype`属性为`multipart/form-data`,这样才能正确地发送文件数据。同时,表单的提交方式应该设置为`POST`。 ```html &lt;form action="/upload" method="post" ...

    SpringMVC文件上传案例

    在Spring MVC框架中,文件上传是一项常见的功能,用于接收用户通过表单提交的文件数据。本案例将深入探讨如何在Spring MVC中实现文件上传,并提供关键知识点和步骤。 首先,理解Spring MVC的基本工作原理至关重要。...

    springMVC上传文件.zip_springmvc_上传文件_文件上传

    在SpringMVC中实现文件上传是一项常见的任务,它涉及到HTTP协议、多部分表单数据处理以及服务器端的文件存储策略。下面将详细阐述如何在SpringMVC中进行文件上传,并涵盖相关知识点。 1. **MultipartFile接口** ...

    springmvc ajax 文件上传

    2. **通过表单提交文件** - **前端**:创建一个HTML表单,包含一个`&lt;input type="file"&gt;`元素,用户选择文件后,提交表单。例如: ```html &lt;form action="/upload" method="post" enctype="multipart/form-data"&gt;...

    SpringMVC上传文件 SSH上传文件

    本主题将深入探讨如何使用SpringMVC和SSH(Struts2 + Hibernate + Spring)框架来实现文件的上传与下载。 首先,我们来看SpringMVC中的文件上传。SpringMVC是Spring框架的一部分,它提供了强大的MVC设计模式支持,...

Global site tag (gtag.js) - Google Analytics