Spring框架之SpringMVC(5.0)

Spring框架之SpringMVC(5.0)

文件上传

在这里插入图片描述
在SpringMVC里面使用的上传组件依然是ApacheFileuplode组件,但是如果要进行上传,不再使用的是file类对象了,而是一个Spring包装好的对象。
在Spring中提供 一个类:

org.springframework.web.multipart.commons.CommonsMultipartFile

进行上传的配置:

org.springframework.web.multipart.commons.CommonsMultipartResolver

1,修改appliacationContext.xml文件:

	<bean id="multipartResolver" 
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置了上传文件的最大容量 -->
		<property name="maxUploadSize" value="524288000"/>
		<!-- 设置上传操作使用的最大内存数量 -->
		<property name="maxInMemorySize" value="2097152"/>
	</bean>

2,定义action实现上传:

package cn.mldn.action;
import java.io.File;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import cn.mldn.vo.Emp;
@Controller
@RequestMapping("/pages/back/emp/*")
// 此处描述的是定义父路径
public class EmpAction { // 完全是一个独立的类
	@RequestMapping(value = "upload")
	public ModelAndView addUpload(Emp emp, MultipartFile photo,
			HttpServletRequest request) {
		System.out.println(emp);
		String fileExt = null ;
		System.out.println("********************** " + photo.getContentType());
		if ("image/jpg".equals(photo.getContentType())) {
			fileExt = "jpg" ;
		}
		String outFilePath = request.getServletContext()
				.getRealPath("/upload/") + UUID.randomUUID() + "." + fileExt;
		try {
			photo.transferTo(new File(outFilePath));
		} catch (Exception e) { 
			e.printStackTrace();
		}	
		return null ;
	}
}

3,定义一个表单:

 <body>
  	<form action="<%=basePath%>pages/back/emp/upload.action" method="post" enctype="multipart/form-data">
  		雇员姓名:<input type="text" name="ename" id="ename"><br>
  		部门名称:<input type="text" name="dept.dname" id="dept.dname"><br>
  		雇员照片:<input type="file" name="photo" id="photo"><br>
  		<input type="submit" value="提交">
  		<input type="reset" value="重置">
  	</form> 
  </body>

发现出错了:少了一个commoms.io包:
在这里插入图片描述
如果超过了设置的大小怎么办:会出现如下的错误提示:

MaxUploadSizeExceededException

最好的做法是将其保存在错误页上:
a,修改applicationContext.xml文件:

<bean id="exceptionMapping" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">
					/errors.jsp
				</prop>
			</props>
		</property>
	</bean>

b,在根目录上增加errors.jsp:

 <body>
  	出错啦!
  </body>

运行结果:
在这里插入图片描述
如果项目里面增加了安全带WEB应用,那么此处只能写上文件名称:

方案一:将errors.jsp 页面拷贝到WEB-INF/pages目录中,同时将跳转的页面设置
为“errors".
方案二:删除WEB安全配置。

当上传的图片超过了Tomcat分配给WEB程序的极限。如果要想解决这个问题已经不能够去修改Spring MVC的配置了;
1,需要打开解析的延迟处理:

<bean id="multipartResolver" 
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置了上传文件的最大容量 -->
		<property name="maxUploadSize" value="524288000"/>
		<!-- 设置上传操作使用的最大内存数量 -->
		<property name="maxInMemorySize" value="2097152"/>
		<property name="resolveLazily" value="true"/>*
	</bean>

出错之后交给一个专门错误处理操作完成。
范例:在EmpAction类中定义一个专门的错误处理方法:

package cn.mldn.action;
import java.io.File;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import cn.mldn.vo.Emp;
@Controller
@RequestMapping("/pages/back/emp/*")
// 此处描述的是定义父路径
public class EmpAction { // 完全是一个独立的类
	@RequestMapping(value = "upload")
	public ModelAndView addUpload(Emp emp, MultipartFile photo,
			HttpServletRequest request) {
		System.out.println(emp);
		String fileExt = null ;
		System.out.println("********************** " + photo.getContentType());
		if ("image/jpg".equals(photo.getContentType())) {
			fileExt = "jpg" ;
		}
		String outFilePath = request.getServletContext()
				.getRealPath("/upload/") + UUID.randomUUID() + "." + fileExt;
		try {
			photo.transferTo(new File(outFilePath));
		} catch (Exception e) { 
			e.printStackTrace();
		}	
		return null ;
	}	
	@ExceptionHandler
	public String exceptionHandle(Exception e) {	// 专门处理异常
		if (e instanceof MaxUploadSizeExceededException) {	// 现在超过了最大的上传文件大小
			System.out.println("**** 进行一些错误的记录处理操作 *******");
		} 
		return "/errors.jsp" ;  
	}
}

范例:修改Tomcat文件
修改%TOMCAT_HOME/conf/server.xml文件

<Connector  connection Timeout=:"20000" port="80" protocol="HTTP/1.1" redirectPort="8443"
maxSwallowSize="-1"/>

此时不对操作进行任何限制;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值