SpringMVC——(三)文件上传下载

2018-11-14 08:00:00     

一、前期准备

  • jar包准备,专门有提供文件上传下载的jar包,具体哪些我也不记得了,前面的博客有提供,都导入就完事了

二、文件上传

1.在eclipse中新建项目【SpringMVCTest02】使用dynamic web project的方式,引入jar包到【lib】目录下,在【src/top.bounds.entity/】目录下新建FileEntity实体类并且使用*@Component*注解,如下代码:

package top.bounds.entity;

import org.springframework.stereotype.Component;

@Component
public class FileEntity {
	//保存文件名
	private String name;
	//保存文件路径
	private String filePath;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getFilePath() {
		return filePath;
	}

	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}

}

2.在【WebContent/view/】目录下新建upload.jsp文件,当我们上传的含有非文本内容,即含有文件(txt、pdf、jpg等)的时候,需要将form的enctype设置为multipart/form-data如下代码:

<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
	<h2>使用spring mvc提供的类的方法上传文件</h2>
	<input type="file" name="file" />
	<input type="submit" value="上传" />
	${msg}
</form>

3.在【src/top.bounds.controller/】包下新建FileUpload类用于解析并保存上传的文件,如下代码:

package top.bounds.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import top.bounds.entity.FileEntity;

@Controller
public class FileUpload {
	@Autowired
	private FileEntity fileEntity;

	/**
	 * 上传文件
	 * @param file
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "/upload", method = RequestMethod.POST)
	public ModelAndView upLoad(MultipartFile file, HttpServletRequest request) {
		ModelAndView mav = new ModelAndView();
		// 如果没有上传文件就返回提交页面
		if (file.getOriginalFilename() == null || file.getOriginalFilename().equals("")) {
			mav.addObject("msg", "不能上传空文件!");
			mav.setViewName("forward:/view/upload.jsp");
			return mav;
		}
		// 1.获取绝对路径
		File upload = new File(request.getSession().getServletContext().getRealPath("/uploadFiles"));
		// 2.如果目录不存在则创建目录
		if (!upload.exists())
			upload.mkdirs();
		// 3.为防止上传的文件名重复,文件采用时间戳的方式命名
		String bcwjm = this.reName(file.getOriginalFilename());
		// 4.存入实际访问路径
		fileEntity.setFilePath(request.getContextPath() + "/uploadFiles/" + bcwjm);
		// 5.设置文件名
		fileEntity.setName(bcwjm);
		// 6、调用FileCopyUtil保存文件
		try {
			String path = request.getSession().getServletContext().getRealPath("/uploadFiles") + "/" + bcwjm;
			//7.打印本地保存的路径
			System.out.println(path);
			// 8.得到完整的保存路径,这里完整的保存路径是包含文件名的,输出流输出
			FileOutputStream out = new FileOutputStream(path);
			FileCopyUtils.copy(file.getInputStream(), out);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		mav.addObject("fileEntity", fileEntity);
		mav.setViewName("show");
		return mav;
	}

	/**
	 * @param ywjm
	 * @return 给上传的图片重命名
	 */
	public String reName(String ywjm) {
		String newFileName = "";// 这个变量用来保存新文件名
		Date dt = new Date();// 这个得到当前的时间
		newFileName = dt.getTime() + "";// getTime得到现在距离1970-01-01 00的毫秒数
		// 得到文件的扩展名
		if (ywjm.indexOf(".") >= 0) {
			newFileName += ywjm.substring(ywjm.lastIndexOf(".")); // xxx.yy.jpg
		}
		return newFileName;
	}
}

4.在【WEB-INF/JSP/】文件夹下新建show.jsp用于显示上传的文件,如下代码:

<img src="${fileEntity.filePath}" width="100px" height="100px">
<a href="${fileEntity.filePath}">预览</a>

5.在【WebContent/config/】目录下新建springMVC-servlet.xml配置文件,加入支持文件上传下载的配置。如下代码:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	 http://www.springframework.org/schema/context 
	 http://www.springframework.org/schema/context/spring-context-3.2.xsd
	 http://www.springframework.org/schema/mvc
	 http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

	<!-- 扫描controller(controller层注入) -->
	<context:component-scan base-package="top.bounds.controller" />
	<!-- 组件扫描FileEntity注入到FileUpload -->
	<context:component-scan base-package="top.bounds.entity" />
	<!--配置对@Controller标签的支持 -->
	<mvc:annotation-driven />
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<!-- 支持文件上传下载 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!--最大上传大小(字节)-->
		<property name="maxUploadSize" value="104857600" />
		<property name="maxInMemorySize" value="4096" />
		<!-- 请求的编码格式 -->
		<property name="defaultEncoding" value="UTF-8"></property>
	</bean>

</beans>

6.配置web.xml文件,因为前端控制器拦截了所有的请求,所以需要设置允许静态资源访问,如下代码:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SpringMVCTest02</display-name>
 	<!-- 静态资源允许访问 -->
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.jpg</url-pattern>
		<url-pattern>*.png</url-pattern>
		<url-pattern>*.gif</url-pattern>
		<url-pattern>*.pdf</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>springMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/config/springMVC-servlet.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- 拦截所有请求资源 -->
	<servlet-mapping>
		<servlet-name>springMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>
  • 后续如果有css、js等文件,也得加上去。

7.启动Tomcat,访问http://localhost:8080/SpringMVCTest02/view/upload.jsp即可看到效果

三、文件下载

1.修改FileUpload类,新增download方法用于下载上传的文件,如下代码:

/**
 * 文件下载
 * @param request
 * @param filename
 * @param model
 * @return
 * @throws Exception
 */
@RequestMapping(value = "/download")
public ResponseEntity<byte[]> download(HttpServletRequest request, String filename, Model model) throws Exception {
	// 下载文件路径
	String path = request.getServletContext().getRealPath("/uploadFiles/");
	File file = new File(path + File.separator + filename);
	HttpHeaders headers = new HttpHeaders();
	// 下载显示的文件名,解决中文名称乱码问题
	String downloadFielName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
	// 通知浏览器以attachment(下载方式)打开图片
	headers.setContentDispositionFormData("attachment", downloadFielName);
	// application/octet-stream : 二进制流数据(最常见的文件下载)。
	headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
	return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}

2.修改show.jsp,新增下载路径,如下代码:

<img src="${fileEntity.filePath}" width="100px" height="100px">
<a href="${fileEntity.filePath}">预览</a>
<a href="${pageContext.request.contextPath}/download?filename=${fileEntity.name}">下载</a>

四、总结

  • form表单的method设置为POST并将enctype设置为multipart/form-data只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器
  • SpringMVC上下文中默认没有装配MultipartResolver因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在springMVC-servlet.xml中配置

ps:本篇博客源码下载链接:https://pan.baidu.com/s/1jK02jmOmmDQP8PwhOOwE3A 密码:e7xv
SpringMVC——(二)接收表单数据

一、前期准备这里使用上一篇博客的源码进行改进SpringMVC——(一)注解配置二、改进【SpringMVCTest01】项目1.在【src/entity】包下新增User实体类如下代码:package entity; public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 2.在【

SpringMVC——(四)拦截器

一、前期准备jar包准备,前面的博客有提供,都导入就完事了二、拦截器实现登录验证1.在eclipse中新建项目【SpringMVCTest03】使用dynamic web project的方式,引入jar包到【lib】目录下,在【src/top.bounds.entity/】目录下新建User实体类如下代码:package top.bounds.entity; public class User { private String username; private String pwd; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPwd() { return pwd;

 发表评论