使用SpringMVC进行文件的上传

文件的上传涉及到的内容:单个文件上传,多个文件上传

一、单个文件的上传

  • 文件上传默认是采用的 apache 的上传组件 commons-fileupload 进行上传。
  • 引入相关的 jar 包
    • commons-fileupload.jar
    • common-io.jar
  • 利用表单 post 提交 注意 content-type 的类型需要更改为 enctype = “multipart/form-data”,form表单默认提交得到 content-type 的类型为 enctype=“application/x-www-form-urlencoded”。
    前台 html 表单代码:
    <h1>单个文件上传</h1>
    <!-- enctype的默认类型是application/x-www-form-urlencoded -->
    <form action="<%=path %>/sysmgr/test/uploadFile" method="post" enctype="multipart/form-data">
    	<input type="file" name="uploadFile" /><br/>
    	<h2><input type="submit" value="单个文件上传" /></h2>
    </form>
    <h2>刚才上传的图片</h2>
    <c:if test="${uploadPath != null}">
    	<img alt="" src="<%=basePath%>${uploadPath}" width="200px" height="200px" />
    </c:if>
    
    SpringMVC 的 Controller 代码:
    package com.qjl.ssm.sysmanage.controller;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.io.FileUtils;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    
    /**
     * 类名称:用于处理文件上传的Controller
     * 全限定性类名: com.qjl.ssm.sysmanage.controller.UploadController
     * @author 曲健磊
     * @date 2018年6月4日下午7:12:35
     * @version V1.0
     */
    @Controller
    @RequestMapping("/sysmgr/test")
    public class UploadController{
    	
    	private static final String FILE_SEPARATOR = System.getProperty("file.separator");
    	
    	@RequestMapping("/uploadFile")
    	// 同样是通过request域来把IO浏览赋值给MultipartFile
    	public String uploadFile(MultipartFile uploadFile, HttpServletRequest request) {
    		// 将文件保存到项目中某个指定的文件夹下面
    		// 得到项目的绝对路径
    		String rootPath = request.getServletContext().getRealPath("upload");
    		// 将上传的图片写入指定的文件
    		if (uploadFile != null) {
    			// 获取上传文件的名称
    			String originName = uploadFile.getOriginalFilename();
    			// 为了保险起见,给图片重新起名字
    			String fileName = UUID.randomUUID().toString();
    			// 获取上传文件的后缀
    			String suffix = originName.substring(originName.lastIndexOf("."));
    			fileName = fileName + suffix;
    			
    			File fileTemp = new File(rootPath);
    			// 文件夹不存在就创建
    			if (!fileTemp.exists()) {
    				fileTemp.mkdir();
    			}
    			
    			File file = new File(rootPath + FILE_SEPARATOR + fileName);
    			try {
    				uploadFile.transferTo(file);
    			} catch (IllegalStateException | IOException e) {
    				e.printStackTrace();
    			}
    			
    			request.setAttribute("uploadPath", "upload/" + fileName);
    		}
    		return "sysmanage/upload/uploadTest";
    	}
    
    }
    
    springmvc.xml 配置文件新增代码:
    <!-- 定义文件上传的解析器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<property name="defaultEncoding" value="UTF-8"></property>
    	<!-- 单位字节,这是所有文件的总大小 -->
    	<property name="maxUploadSize" value="1024000"></property>
    </bean>
    
  • 在springmvc.xml配置文件里面注册上传文件解析器 CommonsMultipartResolver。

二、多个文件的上传

  • 前面的步骤一样,在 handler 方法的参数里面 MultipartFile[] uploadFileBatch 在参数前面要加上 @RequestParam。
    前台表单代码:

    <h1>多个文件上传</h1>
    <!-- enctype的默认类型是application/x-www-form-urlencoded -->
    <form action="<%=path %>/sysmgr/test/uploadFileBatch" method="post" enctype="multipart/form-data">
    	<input type="file" name="uploadFileBatch" /><br/>
    	<input type="file" name="uploadFileBatch" /><br/>
    	<input type="file" name="uploadFileBatch" /><br/>
    	<h2><input type="submit" value="多个文件上传" /></h2>
    </form>
    <h2>刚才上传的图片</h2>
    <table>
    	<tr>
    		<c:forEach items="${map}" var="file">
    			<a href="<%=path%>/sysmgr/test/downloadFile?fileName=${file.value}">${file.key}:</a>
    			<img alt="" src="<%=basePath%>upload/${file.value}" width="200px" height="200px" />
    		</c:forEach>
    	</tr>		
    </table>
    
    package com.qjl.ssm.sysmanage.controller;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.io.FileUtils;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    
    /**
     * 类名称:用于处理文件上传的Controller
     * 全限定性类名: com.qjl.ssm.sysmanage.controller.UploadController
     * @author 曲健磊
     * @date 2018年6月4日下午7:12:35
     * @version V1.0
     */
    @Controller
    @RequestMapping("/sysmgr/test")
    public class UploadController{
    	
    	private static final String FILE_SEPARATOR = System.getProperty("file.separator");
    	
    	@RequestMapping("/uploadFileBatch")
    	// 同样是通过request域来把IO浏览赋值给MultipartFile
    	public String uploadFileBatch(@RequestParam("uploadFileBatch")  MultipartFile[] uploadFileBatch, 
    		HttpServletRequest request) {
    		// 将文件保存到项目中某个指定的文件夹下面
    		// 得到项目的绝对路径
    		String rootPath = request.getServletContext().getRealPath("upload");
    		Map<String, String> map = new HashMap<String, String>();
    		
    		if (uploadFileBatch != null && uploadFileBatch.length > 0) {
    			for (MultipartFile uploadFile : uploadFileBatch) {
    				
    				// 将上传的图片写入指定的文件
    				if (uploadFile != null) {
    					// 获取上传文件的名称
    					String originName = uploadFile.getOriginalFilename();
    					// 为了保险起见,给图片重新起名字
    					String fileName = UUID.randomUUID().toString();
    					// 获取上传文件的后缀
    					String suffix = originName.substring(originName.lastIndexOf("."));
    					fileName = fileName + suffix;
    					
    					File fileTemp = new File(rootPath);
    					// 文件夹不存在就创建
    					if (!fileTemp.exists()) {
    						fileTemp.mkdir();
    					}
    					
    					File file = new File(rootPath + FILE_SEPARATOR + fileName);
    					try {
    						uploadFile.transferTo(file);
    					} catch (IllegalStateException | IOException e) {
    						e.printStackTrace();
    					}
    					// 把所有的图片名都放入一个map中
    					map.put(fileName, fileName);
    				}
    			}
    		}
    		request.setAttribute("map", map);
    		
    		return "sysmanage/upload/uploadTest";
    	}
    }
    
  • 循环 uploadFileBatch 数组,处理方式更单个文件处理方式一样。

三、文件的下载

前台表单代码:

<h1>多个文件上传</h1>
<!-- enctype的默认类型是application/x-www-form-urlencoded -->
<form action="<%=path %>/sysmgr/test/uploadFileBatch" method="post" enctype="multipart/form-data">
	<input type="file" name="uploadFileBatch" /><br/>
	<input type="file" name="uploadFileBatch" /><br/>
	<input type="file" name="uploadFileBatch" /><br/>
	<h2><input type="submit" value="多个文件上传" /></h2>
</form>
<h2>刚才上传的图片</h2>
<table>
	<tr>
		<c:forEach items="${map}" var="file">
			<a href="<%=path%>/sysmgr/test/downloadFile?fileName=${file.value}">${file.key}:</a>
			<img alt="" src="<%=basePath%>upload/${file.value}" width="200px" height="200px" />
		</c:forEach>
	</tr>		
</table>

SpringMVC 的 Controller 代码:

package com.qjl.ssm.sysmanage.controller;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

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

import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

/**
 * 类名称:用于处理文件上传的Controller
 * 全限定性类名: com.qjl.ssm.sysmanage.controller.UploadController
 * @author 曲健磊
 * @date 2018年6月4日下午7:12:35
 * @version V1.0
 */
@Controller
@RequestMapping("/sysmgr/test")
public class UploadController{
	
	private static final String FILE_SEPARATOR = System.getProperty("file.separator");

	// 下载文件
	@RequestMapping("/downloadFile")
	public void downloadFile(String fileName, HttpServletRequest request,
		HttpServletResponse response) {
		if (fileName != null) {
			String realPath = request.getServletContext().getRealPath("upload");			
			File file = new File(realPath, fileName);
			OutputStream out = null;
			if (file.exists()) {
				response.setContentType("application/force-download");
				response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
				
				try {
					out = response.getOutputStream();
					out.write(FileUtils.readFileToByteArray(file));
					out.flush();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					if (out != null) {
						try {
							out.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
	}
	
}

ps:如果要想在页面上访问图片,必须通过访问项目的方式来访问图片,不能直接访问磁盘中的文件。

上传的实际应用场景:上传 Excel,用 Apache 的 POI 把 Excel 的数据读出来,存到数据库中。用 Excel 导入系统的初始化数据,初始化系统。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值