Spring MVC文件上传

实现文件上传

导入jar文件
commons-io-2.4.jar、commons-fileupload-1.2.2.jar、commons-lang-2.6.jar

MultipartResolver接口
用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作

MultipartResolver接口有两个实现类
StandardServletMultipartResolver:使用了Servlet3.0标准的上传方式
CommonsMultipartResolver:使用了Apache的commons-fileupload来完成具体的上传操作

文件上传的步骤:

  1. 导入jar包
  2. 配置MultipartResolver (springmvc-servlet.xml)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- maxUploadSize上传文件大小上限,单位是子节 -->
		<property name="maxUploadSize" value="5000000"/>
		<!-- defaultEncoding请求编码格式,默认为ISO-8859-1,此处设置为utf-8 -->
		<property name="defaultEncoding" value="utf-8"/>
	</bean>
  1. 编写文件上传表单页面
  2. 在Controller实现文件上传的方法

单文件上传

@RequestMapping(value="/addsave.html",method=RequestMethod.POST)
public String addUserSave(User user,
				HttpSession session,HttpServletRequest request,
				@RequestParam(value="a_idPicPath",required=false) MultipartFile attach){
				
		String idPicPath = null;
		//判断文件是否我空
		if(!attach.isEmpty()){
			//定义目标长传路径   (file.separator这个代表系统目录中的间隔符 ,自适应的)
			String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
			//获取源文件名
			String oldFileName = attach.getOriginalFilename();
			//获取源文件的后缀
			String prefix = FilenameUtils.getExtension(oldFileName);
			//获取源文件的大小
			int filesize = 500000;
			if(attach.getSize() > filesize){
				request.setAttribute("uplocadFileError", "*上传大小不得超过500k");
				return "useradd.html";
			}else if(prefix.equalsIgnoreCase("jpg")
					|| prefix.equalsIgnoreCase("jpeg")
					|| prefix.equalsIgnoreCase("png")
					|| prefix.equalsIgnoreCase("pneg")){
				//创建新的文件名(规则:当前系统时间+随机数+"_Personal.jpg")
				String fileName = System.currentTimeMillis() + RandomUtils.nextInt(1000000) + "_Personal.jpg";
				//创建一个新的File对象(传两个参数 目标路径和文件名)
				File targetFile = new File(path,fileName);
				//判断targetFile是否存在如果不存在则创建
				if(!targetFile.exists()){
					targetFile.mkdirs();
				}
				try {
					//接收用户上传的文件流
					attach.transferTo(targetFile);
				} catch (Exception e) {
					e.printStackTrace();
					request.setAttribute("uplocadFileError", "*上传失败");
					return "useradd.html";
				}
				idPicPath = path + File.separator + fileName;
			}else{
				request.setAttribute("uplocadFileError", "*上传图片格式不正确");
				return "useradd.html";
			}
		}
		
		
		user.setCreatedBy(((User)session.getAttribute("userSession")).getId());
		user.setCreationDate(new Date());
		user.setIdPicPath(idPicPath);
		if(userService.add(user)){
			return "redirect:/user/userList.html";
		};
		return "redirect:/user/useradd";
	}

多文件上传

@RequestMapping(value="/addsave.html",method=RequestMethod.POST)
	public String addUserSave(User user,
				HttpSession session,HttpServletRequest request,
				@RequestParam(value="attachs",required=false) MultipartFile[] attachs){
		String idPicPath = null;
		String workPicPath = null;
		boolean flag = true;
		//错误信息的提示 
		String errorInfo = null;
		//定义目标长传路径   (file.separator这个代表系统目录中的间隔符 ,自适应的)
		String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
		
		for(int i=0; i < attachs.length; i++){
			MultipartFile attach = attachs[i];
			//判断文件是否我空
			if(!attach.isEmpty()){
				if(i == 0){
					errorInfo = "uplocadFileError";
				}if(i == 1){
					errorInfo = "uplocadwpError";
				}
				//获取源文件名
				String oldFileName = attach.getOriginalFilename();
				//获取源文件的后缀
				String prefix = FilenameUtils.getExtension(oldFileName);
				//获取源文件的大小
				int filesize = 500000;
				if(attach.getSize() > filesize){
					request.setAttribute(errorInfo, "*上传大小不得超过500k");
					flag = false;
				}else if(prefix.equalsIgnoreCase("jpg")
						|| prefix.equalsIgnoreCase("jpeg")
						|| prefix.equalsIgnoreCase("png")
						|| prefix.equalsIgnoreCase("pneg")){
					//创建新的文件名(规则:当前系统时间+随机数+"_Personal.jpg")
					String fileName = System.currentTimeMillis() + RandomUtils.nextInt(1000000) + "_Personal.jpg";
					//创建一个新的File对象(传两个参数 目标路径和文件名)
					File targetFile = new File(path,fileName);
					//判断targetFile是否存在如果不存在则创建
					if(!targetFile.exists()){
						targetFile.mkdirs();
					}
					try {
						//接收用户上传的文件流
						attach.transferTo(targetFile);
					} catch (Exception e) {
						e.printStackTrace();
						request.setAttribute(errorInfo, "*上传失败");
						flag = false;
					}
					if(i == 0){
						idPicPath = path + File.separator + fileName;
					}else if(i == 1){
						workPicPath = path + File.separator + fileName;
					}
				}else{
					request.setAttribute(errorInfo, "*上传文件格式不正确");
					flag = false;
				}
			}
		}
		if(flag){
			user.setCreatedBy(((User)session.getAttribute("userSession")).getId());
			user.setCreationDate(new Date());
			user.setIdPicPath(idPicPath);
			user.setWorkPicPath(workPicPath);
			if(userService.add(user)){
				return "redirect:/user/userList.html";
			};
		}
		return "redirect:/user/useradd";
	}>

注意

  1. File.separator:Windows、Linux自适应路径分隔符、低入侵性的代码实现
  2. 必须对上传文件进行重命名:
    原因:原文件名存在中文会有 乱码问题、原文件名与服务器上已有文件重名 会有覆盖问题
    重新定义上传文件名(保证不重名)命名规则:当前系统时间+随机数+“_Personal.jpg”
  3. 文件上传成功后,须更新数据库字段(idPicPath),记录上传文件的存储路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值