使用SpringMVC的单文件上传 (含配置全局异常处理器)

单文件上传

  • 环境:myeclipse 2018 jdk1.8 tomcat9.0
  • 使用框架:SpringMVC
    按照以下步骤是环境、框架已经配置好的基础上哦

1.前台jsp页面中

一定要有的:
form表单 post提交 enctype=“multipart/form-data”

2.Pom.xml文件中加入两个jar包

<!-- 文件上传需要导入的jar包 -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.3</version>
		</dependency>
		
		<dependency>
    		<groupId>commons-fileupload</groupId>
    		<artifactId>commons-fileupload</artifactId>
    		<version>1.3.2</version>
		</dependency>

3.后台,action中,前台的uploadfile可以用MultipartFile类对象来接收

在这里插入图片描述

4.项目结构先看一下

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190623155949252.png

5.在Spring-mvc.xml中配置文件上传解析器

MultipartResolver(限制上传文件的大小)和文件上传的路径
因为限制了上传文件的大小所以超出限制之后会报错,为了防止页面出现500的错误,我们希望在界面上可以提示用户“上传文件超过限制大小”的提示。

<!-- 文件上传解析器:配置 MultipartResolver -->
     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	    	<!-- 单个文件的 大小   -->
	    	<property name="maxInMemorySize" value="65536000"></property>
	    	<!-- 每次上传的总大小 -->
	    	<property name="maxUploadSize" value="1310720000"></property>
	    	
	    </bean>
	    
	     <!-- 文件上传路径  配置文件配置  -->
	    <!-- PropertiesFactoryBean 用来读取 和 注入 properties配置文件的内容的-->
	    <bean id="uploadProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
	    	
	    
	    </bean>
 <!-- 配置全局异常处理器 -->
    <bean id="handlerExceptionResolver" 
	    class="com.b_exception.CustomExceptionResolver"></bean>

1)配置全局的异常处理器
自定义一个全局异常处理器类,去实现HandlerExceptionResolver ,其中,只有一个方法需要覆盖,在该方法中用instanceof 关键字 判断是属于哪一个异常,并返回一个视图

package com.b_exception;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;


public class CustomExceptionResolver implements HandlerExceptionResolver{

	/**
	 * 
	 * SpringMVC所抛出来的所有异常 都 交到这里来处理
	 *
	 */
	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		
		ModelAndView model = null;
		//打印异常的栈信息
		ex.printStackTrace();
		//文件上传的异常
		if(ex instanceof MaxUploadSizeExceededException){
			//整个文件上传不能超过 128kb
			//创建一个ModelAndView
			model = new ModelAndView("/file_load");
			//错误信息
			model.addObject("error_message", "文件上传总大小不能超过128kb");
		}else if(ex instanceof SizeLimitExceededException){
			//单个文件上传不能超过64kb
			//创建一个ModelAndView
			model = new ModelAndView("/file_load");
			//错误信息
			model.addObject("error_message", "文件上传总大小不能超过128kb");
		}else if(ex instanceof FileSizeLimitExceededException){
			//创建一个ModelAndView
			model = new ModelAndView("/file_load");
			//错误信息
			model.addObject("error_message", "单个文件上传总大小不能超过64kb");
		}/*else if(ex instanceof CustomException){
			//创建一个ModelAndView
			model = new ModelAndView("/500");
			//错误信息
			model.addObject("error_message", ex.getMessage());
		}*/
		
		return model;
	}

}

6.action中添加一个方法

@RequestMapping("upload")
	public ModelAndView upload(MultipartFile uploadfile) {		
		String fileName = uploadfile.getOriginalFilename();
		String Name = uploadfile.getName();
		String contentType = uploadfile.getContentType();
		long size = uploadfile.getSize();
		System.out.println("文件名:"+fileName);
		System.out.println("input的name值"+Name);
		System.out.println("文件类型"+contentType);
		System.out.println("文件大小"+size);	
		return null;		
	}

7.写jsp页面

<body>
  
  	<h1>单文件上传</h1>
  	<font color="red"></font>
    <form action="${path}/upload/upload.action" method="post" enctype="multipart/form-data">
    	<input type="file" name="uploadfile">
    	<input type="submit" value="上传">
    </form>
    
    <div style="color:red"> </div>
    
    <h1>多文件上传</h1>
     <form action="" method="post" enctype="multipart/form-data">
    	<input type="file" name="filename1"><br/>
    	<input type="file" name="filename2"><br/>
    	<input type="file" name="filename3"><br/>
    	<input type="submit" value="上传">
    </form>
  </body>

8.在Action的upload()方法中,将上传的文件通过后台保存到服务器中,添加代码(使用了FileUtils工具类)

@RequestMapping("upload")
	public ModelAndView upload(MultipartFile uploadfile,ModelMap modelmap) {
		
		String fileName = uploadfile.getOriginalFilename();
		String Name = uploadfile.getName();
		String contentType = uploadfile.getContentType();
		long size = uploadfile.getSize();
		System.out.println("文件名:"+fileName);
		System.out.println("input的name值"+Name);
		System.out.println("文件类型"+contentType);
		System.out.println("文件大小"+size);
		
		/**
		 * 用户上传一个文件,后台把文件保存到服务器中
		 * 使用工具类(FileUtils)来完成
		 */
		try {
			FileUtils.copyInputStreamToFile(uploadfile.getInputStream(), new File( "E:/temp/"+fileName ));
			modelmap.addAttribute("message", "文件上传成功!");
			modelmap.addAttribute("fileName", fileName);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			modelmap.addAttribute("message", "文件上传失败!");
			
		}
		
		return new ModelAndView("/success");
		
	}

Success.jsp

<body>
   <span>${message }</span> &nbsp;文件名:${fileName }
 
  </body>

9.测试

上传成功显示success.jsp界面
否则 提示用户上传文件超过限制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值