SpringMVC(23):使用springmvc+spring+jdbc 优化订单管理系统的示例(单文件上传功能的实现)

2018年1月28日

功能:利用Springmvc 实现单文件上传;使用了MultipartResolver接口;

【0】MultipartResolver接口用于处理上传请求,将上传请求包装成了可以获取文件的数据,大大方便了操作;它有两个实现类:CommonsMultipartResolver StandardservletMultipartResolver

      后者(StandardservletMultipartResolver)使用了Servlet3.0标准的上传方式;

      前者(CommonsMultipartResolver )使用了Apache的commons-fileupload 来完成具体的上传操作;我下面使用的是CommonsMultipartResolver ;


【1】项目jar包与文件框架


图1


图2

为了方便理解,先从简单的View入手,再到Controller、Service 与 Dao层,最后是数据库Mysql;


【2】View层,在useradd.jsp添加了以下代码:

   <h5>以下为上传-单文件测试</h5>
   <form action="${pageContext.request.contextPath }/user/upload" method="post" enctype="multipart/form-data">
      <input type="hidden" id="errorinfo" value="${uploadFileError}">         
                文件:<input type="file" name="uploadFile"/><br/><br/>
      <input type="submit" value="上传"/>
   </form>


注意之处:1、enctype="multipart/form-data",指定表单内容的类型,支持文件上传;2、<input type="file" name="uploadFile"/>,file组件。


显示效果:


图3


图4(testfile1.png)

注意之处:1、文件名要全英文,中文可能会在传输乱码或者报错! 2、文件路径要全英文,中文可能会在传输乱码或者报错!


【3】需要在springmvc配置文件进行MultipartResolver注册(springmvc-servlet.xml):

  	<!-- 配置MultipartResolver -->
  	<bean id="multipartResolver" 
  	  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  	 	<property name="maxUploadSize" value="5000000"></property>
  	 	<property name="defaultEncoding" value="UTF-8"></property> 
  	 </bean>

注意之处:1、这里设置了请求的编码格式,设置为UTF-8,要和JSP的pageEncoding设置一样,才能便于读取;2、maxUploadSize,上传文件的大小上限,单位是字节(Byte);


【4】Controller控制器,主要是对文件上传确定后的一些后台处理(文件名称、大小、格式是否合格),因此,只需要在UserController.java文件添加处理方法:

	@RequestMapping(value="/upload" ,method=RequestMethod.POST)
	public String test(HttpSession session ,HttpServletRequest  request,
			MultipartFile uploadFile) throws Exception, IOException{
		System.out.println("test==");
		String idPicPath = null;
		if(!(uploadFile.isEmpty())){
			System.out.println("begin attaching...");
			//获取保存文件的绝对路径
			String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
			System.out.println("2.1 uploadFile path ===>"+path);
			//获取上传文件的文件名
			String oldFileName = uploadFile.getOriginalFilename();//原文件名
			System.out.println("2.2 uploadFile oldFileName ===>"+oldFileName);
			//获取文件名后缀
			String prefix = FilenameUtils.getExtension(oldFileName);//原文件名后缀
			System.out.println("2.3 uploadFile prefix ===>"+prefix);
			//设置文件大小的变量,KB是单位
			int filesize = 5000000;
			System.out.println("2.4 uploadFile filesize ===>"+uploadFile.getSize());
			if(uploadFile.getSize() > filesize){
				request.setAttribute("uploadFileError", "* 上传大小不得超过5000KB");
				System.out.println("* 上传大小不得超过5000KB");
				return "useradd";
			}else if(prefix.equalsIgnoreCase("jpg")
					   || prefix.equalsIgnoreCase("png")
					   || prefix.equalsIgnoreCase("jpeg")
					   || prefix.equalsIgnoreCase("pneg")){
				//上传格式正确,重命名文件
				String fileName = System.currentTimeMillis()+RandomUtils.nextInt(1000000)+"_Personal.jpg";
				System.out.println("2.5 new fileName===>"+uploadFile.getName());
				//新建这么一个文件,FILE API
				File targetFile = new File(path,fileName); 
				if(!targetFile.exists()){
					targetFile.mkdirs();
				}
				//保存
				try{
					//上传
					uploadFile.transferTo(targetFile);
				}catch (Exception e){
					e.printStackTrace();
					request.setAttribute("uploadFileError", "* 上传失败! ");
					System.out.println("* 上传失败! ");
					return "useradd";
				}
				idPicPath = path+File.separator+fileName;
			}else{
				request.setAttribute("uploadFileError", "* 上传格式错误!");
				System.out.println("* 上传格式错误!");
				return "useradd";
			}
//			//获取文件名字作保存在服务器的文件名
//			String filename = uploadFile.getOriginalFilename();
//			
//			//前半部分,目录,将WebRoot下一个名称为image的文件夹 转化为绝对路径
//			String leftPath = session.getServletContext().getRealPath("statics");
//			//进行路径拼接
//			File file = new File(leftPath,filename);
//			System.out.println("file path: "+file.getPath());
//			//把 MultipartFile 文件流的数据输出到目标文件
//			uploadFile.transferTo(file);
		}
		User user = new User();
		user.setIdPicPath(idPicPath);
		System.out.println("user.idPicPath: "+ user.getIdPicPath());
		return "userlist";
			
	}

解释:(1)上面用到的API 可以参考开发手册去理解用法:

1.FilenameUtils:getExtension(oldFileName),来自
2.MultipartFile:getOriginalFilename()、isEmpty()、
3.session.getServletContext().getRealPath()
4.File.separator

(2)RandomUtils 工具类的使用,需要导入jar包:



【5】测试结果:

打印日志:

begin attaching...
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
2.2 uploadFile oldFileName ===>testfile1.png
2.3 uploadFile prefix ===>png
2.4 uploadFile filesize ===>138624
2.5 new fileName===>uploadFile
user.idPicPath: D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517554236373_Personal.jpg

文件结构:


图5


【6】改进之处:因为很多时候,不仅仅只是上传文件,还需要传递别的数据,所以之后的博文会继续讲到相关内容。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值