SpringMVC文件上传,支持一次选中多个文件

前台简单展示如下

<form name="Form2" action="${pageContext.request.contextPath}/bussiness/attendance/upload" method="post"  enctype="multipart/form-data">
		<h1>使用spring mvc提供的类的方法上传文件</h1>
		单个文件:<input type="file" name="file" >
		多个文件:<input type="file" name="file1" multiple >
		<iput type="submit" value="上传"/>
</form>

 选中之后是这样的:

 需要注意的是, 要实现文件上传, form中必须指定属性enctype="multipart/form-data". method属性为"post"

前台就是这些基本的了,主要看后台:

首先SpringMVC配置文件中加这么一个bean

<bean id="multipartResolver"
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 默认编码 -->
	<property name="defaultEncoding" value="utf-8" />
	<!-- 文件大小最大值 -->
	<property name="maxUploadSize" value="10485760" />
	<!-- 内存中的最大值 -->
	<property name="maxInMemorySize" value="40960" />
</bean>

其中maxUploadSize属性用来设计上传文件的最大值, 单位是字节. 注意这里是总的上传限制, 比如设置为10M, 上传了4个3M的文件. 虽然单个文件都在10M以内, 但是总大小已经超过10M限制, 会抛出MaxUploadSizeExceededException异常 

也可以在代码中直接创建对象

CommonsMultipartResolver commonsMultipartResolver = new   CommonsMultipartResolver(request.getSession().getServletContext());

但是个人认为配置以后使用比较方便, 各位根据实际需要来。我是直接创建对象的

Service代码:

	
	//文件上传
	@Override
	public List<String> upload(HttpServletRequest request) throws IllegalStateException, IOException {
		List<String> list = new ArrayList<>();
		//将当前上下文初始化给CommonsMultipartResolver(多部分解析器)
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		
		//检查form中是否带有enctype="multipart/form-data"
		if(multipartResolver.isMultipart(request)) {
			//将request变成多部分request
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
			//获取multiRequest 中所有的文件名 <input>标签中的name属性
			Iterator<String> fileNames=multiRequest.getFileNames();
			while(fileNames.hasNext()) {
				String fileName = fileNames.next();
				 /*
	             * multiRequest.getFiles(fileName)方法即通过fileName这个Key, 得到对应的文件
	                                * 集合列表. 只是在这个Map中, 文件被包装成MultipartFile类型
	             */
				List<MultipartFile> fileList = multiRequest.getFiles(fileName);
				if(fileList != null && fileList.size() > 0) {
					//遍历文件列表
					Iterator<MultipartFile> fileIte = fileList.iterator();
					while(fileIte.hasNext()) {
						//获得每一个文件
						MultipartFile multipartFile = fileIte.next();
						//定义文件存放路径
						String realPath = request.getSession().getServletContext().getRealPath("/");
	                	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
	                    String str = "upload/" + multipartFile.getOriginalFilename();
	                    String path1 = realPath + str; //保存到服务器地址
	                    String path2 = basePath + str; //保存到项目根目录地址
	                    
	                    //检查该路径对应的目录是否存在. 如果不存在则创建目录
	                    File file = new File(path1);
	                    if(!file.exists()) {
	                    	file.mkdirs();
	                    }
	                    multipartFile.transferTo(file);
	                    list.add(path2);
					}
				}
            }
		}
		System.out.println("=======================");
		System.out.println(list);
		System.out.println("=======================");
		return list;
	}
		

Controller代码:

	
	/**
	 *  图片上传
	 * @param request
	 * @return
	 * @throws IllegalStateException
	 * @throws IOException
	 */
	@RequestMapping(value = "upload", method = RequestMethod.POST)
	@ResponseBody
	public AjaxRes springUpload(HttpServletRequest request) throws IllegalStateException, IOException {
		AjaxRes ar = getAjaxRes();
		try {
			List<String> list = service.upload(request);
			ar.setSucceed(list);
		}catch (BussinessException e) {
			ar.setFailMsg("文件上传失败");
		}catch (Exception e) {
			logger.error(e.toString(), e);
			ar.setFailMsg("文件上传失败");
		}
		return ar;
	}
	

备注:controller方法参数可以用 MultipartHttpServletRequest request 代替 HttpServletRequest request.

HttpServletRequest request使用更简洁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值