一、搭建Spring开发环境
1.1 在web.xml 中配置Servlet
<!--配置MVC中央控制器:DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化一些参数 init-->
<!--指定Spring配置文件的路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--容器在启动时就加载Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--设置此Servlet截获并处理所有的URL请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
1.2 springmvc-config.xml:
<context:component-scan base-package="com.ytzl.controller"/>
<context:component-scan base-package="com.ytzl.service"/>
<!--2、开启mvc注解驱动:自动注册生成两个工具:处理器映射器(HandleMapping)和处理器适配器(HandleAdapter)-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/><!--前缀-->
<property name="suffix" value=".jsp"/><!--后缀-->
</bean>
<!--配置全局异常捕获-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">error</prop>
</props>
</property>
</bean>
<!--配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件的最大大小-->
<property name="maxUploadSize" value="17367648787"></property>
<!--传文件的编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
二、新建页面
2.2创建fileUpdate.jsp 页面 需要注意的是form 表单 要加上 属性entcypt=“multipart/form-data”,这表示上传的将会是二进制流的格式,以规定的二进制进行上传,便于服务器处理,使用post请求:
<form action="FileUpdate" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>请选择文件:</td>
<td><input type="file" name="file"></td>
</tr>
<tr>
<td>开始上传</td>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
2.2:再写一个上传成功的jsp页面,主要是用来当上传成功时候跳转的页面,命名为:success.jsp
<body>
<h2>文件上传成功!</h2>
</body>
2.3:然后再写一个上传失败的页面,主要是用来当上传失败的时候跳转的页面,命名为:error.jsp
<body>
<h2>文件上传失败!请检查文件是否存在</h2>
</body>
2.3:创建控制器 SpringMVC 控制器
//文件上传
@RequestMapping(value = "/FileUpdate", method = RequestMethod.POST)
public String fileUpdate(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
if (!file.isEmpty()) {
String contextPath = request.getContextPath();//"/SpringMvcFileUpload" 项目路径
String servletPath = request.getServletPath();//"/gotoAction" 本次请求的路径
String scheme = request.getScheme();//"http" //协议
String storePath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//存放我们上传的文件路径
String fileName = file.getOriginalFilename();
File filepath = new File(storePath, fileName); // 文件的写入的路径
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();//如果目录不存在,创建目录
}
try {
// file.transferTo(new File(storePath + File.separator + fileName));//把文件写入目标文件地址
file.transferTo(new File(String.valueOf(filepath)));//把文件写入目标文件地址
} catch (Exception e) {
e.printStackTrace();
return "error";
}
return "success";//返回到成功页面
} else {
return "error";//返回到失败的页面
}
}
2.5:好了,到此我们就可以实现上传功能了,发布在Tomact容器里,然后就可以进行上传文件了。在浏览中输入:自己服务器 部署 的 项目路径 具体的页面请求如下,然后浏览具体的文件,点击上传按钮:
上传成功!
三、文件下载 , 将文件绑定到具体的对象上 首先定义 一个实体类 private MultipartFile file; 这个 对象主要用于 绑定 上传的文件
package com.ytzl.pojo;
import org.springframework.web.multipart.MultipartFile;
import java.io.Serializable;
public class UserFrom implements Serializable {
private String uname; // 与请求参数名称相同
private String upass;
private String reupass;
private MultipartFile file; //上传文件会自动绑定到该属性
//省略 getre seter 方法 ......
3.2创建一个 register.jsp 页面 用于模拟用户 注册上传头像的 场景 如下
<form action="${pageContext.request.contextPath }/register" method="post" enctype="multipart/form-data" >
<table border=1 bgcolor="lightblue" align="center">
<tr><td>姓名:</td><td><input class="textSize" type="text" name="uname" /></td></tr>
<tr><td>密码:</td><td><input class="textSize" type="password" maxlength="20" name="upass" /></td></tr>
<tr><td>确认密码:</td><td><input class="textSize" type="password" maxlength="20" name="reupass" /></td></tr>
<tr><td>请选择头像:</td><td><input type="file" name="file"></td></tr>
<tr><td>开始上传</td><td><input type="submit" value="上传"></td></tr>
</table>
</form>
</body>
3.3:写我们的方法控制器处理注册逻辑的层的代码,注意其中的user对象加入了@ModelAttribute注解,其主要作用是用来映射把上面的form表单的file属性自动注入到对象里面,还有Map<String,Object>
map主要是为了存放user对象,放在requestScope里面,这样就可用el表达式把其中的值取出来了。
//文件下载-文件上传
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@ModelAttribute UserFrom user, HttpServletRequest request, Map<String, Object> map) {
MultipartFile file = user.getFile();
boolean empty = file.isEmpty();
String wrong = "success";
String good = "download";
if (!empty) {
String realPath = request.getServletContext().getRealPath("/images");
String uploadPath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";
String headimageName = file.getOriginalFilename();
File imageFile = new File(uploadPath, headimageName);
try {
file.transferTo(new File(uploadPath + File.separator + headimageName));
} catch (IOException e) {
e.printStackTrace();
return wrong;
}
map.put("user", user);
return good;
} else {
return wrong;
}
}
3.4 我们再新建一个 download.jsp 页面 用来 下载我们 模拟注册 上传后的文件
<body>
用户头像:${user.file.originalFilename} // requestScope 这里 是可以不用写 的 他默认会从小到大 在域里找user
</body>
四、实现用户下载 功能 改造 我们的 download.jsp
<body>
<p>${requestScope.user.file}</p>
<h3>文件下载</h3>
<p>用户头像:<a href="download?filename=${requestScope.user.file.originalFilename}">下载:${requestScope.user.file.originalFilename}</a></p>
</body>
4.2 然后 开始 编写 download 控制器 注意download方法返回的是ResponseEntity<byte[]> 类型,这个是封装好的返回类型,我们需要传入byte数组、headers、HttpStatus,然后它就会返回具体的下载流,调用客户端去下载资源
//文件下载
@RequestMapping(value = "download", method = RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) throws IOException {
String downloadFilePath="E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//从我们的上传文件夹中去取
File file = new File(downloadFilePath+File.separator+filename);//新建一个文件
HttpHeaders headers = new HttpHeaders();//http头信息
String downloadFileName = new String(filename.getBytes("UTF-8"),"iso-8859-1");//设置编码
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//MediaType:互联网媒介类型 contentType:具体请求中的媒体类型信息
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
页面顶部的 语句 忽略
4.3 开始测试
点击 开始下载
如图左下角 的 下载完成 去查看 控制器 下载路径的位置 文件就已经在了
本篇博文介绍了SpringMvc上传和文件的功能,需要注意的地方就是对于文件上传包common-fileupload.jar包的使用,还有在配置文件上配置mulitipartResolver这个bean。下面又介绍了用java 实体类去映射上传文件的属性对应的文件,这点的好处就是它会自动映射,然后把对象放入到我们的请求域中,就可以展示给界面用户层,这也是mvc思想模式的体现。接下来是介绍去下载文件,只需要从我们的写入的目标地址去取出文件,再进行responseEntity对象的封装,就可以实现下载功能
参考自 :https://www.cnblogs.com/wyq178/p/6921164.html