Spring MVC、文件上传下载
Spring MVC、文件上传下载
木子丰 发表于4年前
Spring MVC、文件上传下载
  • 发表于 4年前
  • 阅读 2339
  • 收藏 25
  • 点赞 3
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

相关jar包:
导入文件上传下载组件的jar包
commons-fileupload-1.3.jar
commons-io-2.4.jar

Spring MVC中使用JstlView时需要添加的包
jstl-1.1.2.jar
standard-1.1.2.jar

1.整体架构

2.web.xml文件配置DispatcherServlet拦截所有的请求

<servlet>
    <servlet-name>chapter2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/conf/chapter2-servlet.xml</param-value>
        </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>chapter2</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

DispatcherServlet默认会加载WEB-INF/[DispatcherServlet的servlet-name]-servlet.xml配置文件。
这里的[servlet-name]为chapter2,就一定要添加一个chapter2-servlet.xml文件

这里该文件不是在默认位置WEB-INF下,而是在WEB-INF/conf/下,就需要通过<init-param>指定其配置路径
contextConfigLocation

<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/conf/chapter2-servlet.xml</param-value>
</init-param>

<load-on-startup>指定服务器启动时DispatcherServlet初始化的优先级,数字越小越优先初始化。


3.xxx-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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 
        启动SpringMVC的注解功能,它会自动注册HandlerMapping、
        HandlerAdapter、ExceptionResolver的相关实例
    -->
    <mvc:annotation-driven />
    <mvc:default-servlet-handler />
    <!-- DispatcherServlet会过滤所有的请求,这样请求静态资源时会出问题,加上该配置后,请求resources下面的静态资源时,url不会被过滤 -->
    <mvc:resources mapping="/resources/**" location="/resources/" />
    <!-- 扫描添加了@Controller等注解的类 -->
    <context:component-scan base-package="cn.javass.chapter2.web.controller" />

    <!-- 
        ViewResolver 视图解析器,对处理器返回的ModelAndView进行解析,
        返回到相应的视图页面, 以UploadController为例,上传成功后经过解析会
        返回/WEB-INF/jsp/success.jsp视图页面
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <!-- 文件解析器 -->
    <bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
        <property name="maxUploadSize" value="10485760000"></property>
        <property name="maxInMemorySize" value="40960"></property>
    </bean>
</beans>

4.Controller控制器

package cn.javass.chapter2.web.controller;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

@Controller
@RequestMapping("/file")
public class UploadController {

	@RequestMapping("/upload")
	public String upload(@RequestParam CommonsMultipartFile file,
			HttpServletRequest request) throws IllegalStateException,
			IOException {
		// isEmpty()返回上传的文件是否为空,有2种情况: 1、文件表单中是否选择了文件 2、选择的文件是否有内容
		if (!file.isEmpty()) {
			String fileName = file.getOriginalFilename();
			fileName = new Date().getTime() + fileName;
			System.out.println("文件名----------->" + fileName);
			String extension = fileName
					.substring(fileName.lastIndexOf(".") + 1);
			if (extension != null
					&& (extension.equalsIgnoreCase("xls") || extension
							.equalsIgnoreCase("xlsx"))) {
				final String TEMP_FILE_PATH = request.getServletContext()
						.getRealPath("/WEB-INF/upload");
				final String FILE_SEPARATOR = System.getProperties()
						.getProperty("file.separator");
				String filePath = TEMP_FILE_PATH + FILE_SEPARATOR + fileName;
				File f = new File(filePath);
				// 2种文件拷贝的方法
				file.transferTo(f);
				// FileUtils.copyInputStreamToFile(file.getInputStream(), f);

				// 删除保存时间超过2天的临时文件
				deleteTempFile(2, TEMP_FILE_PATH);

				return "success";
			} else {
				System.out.println("文件格式不对,请上传xls或xlsx格式");
				return "fail";
			}
		} else {
			return "fail";
		}
	}

	@RequestMapping("/toupload")
	public String toUpload() {
		return "upload";
	}

	/**
	 * 删除指定目录path下,文件存在时间超过指定day天数的文件
	 * 
	 * @param day
	 *            所要清理的目标文件已经存在的天数
	 * @param path
	 *            所要清理文件的文件夹路径
	 */

	private void deleteTempFile(int day, String path) {
		Date date;
		Date dateNow;
		Calendar cal = Calendar.getInstance();
		Calendar calNow = Calendar.getInstance();
		File filepath = new File(path);
		File[] files;
		if (filepath.exists()) {
			if (filepath.isDirectory()) {
				files = filepath.listFiles();
				for (int i = 0; i < files.length; i++) {
					date = new Date(files[i].lastModified());
					dateNow = new Date();
					cal.setTime(date);
					calNow.setTime(dateNow);
					int dec = calNow.get(Calendar.DAY_OF_YEAR)
							- cal.get(Calendar.DAY_OF_YEAR);
					// 删除指定日期的文件
					if (dec >= day) {
						files[i].delete();
					}
				}
			}
		}
	}
}

@Controller 指定该类为控制器,可以拦截url请求,也可以直接使用HttpServletRequest/Response
@RequestMapping 的value指定请求映射的url
@RequestParam 可以取出请求时传输的参数

参数传递:
1.Controller获取请求url的参数:
①在方法中使用使用@RequestParam("paramName")
②在方法中使用与请求url中参数同名的形参


2.视图获取Controller传递的参数
①方法中使用一个Map<String, Object>的形参,参数名任意,比如名为map的形参,可以通过map.setAttribute(String key, Object value)设置参数,在视图层通过EL表达式${key}即可获取
②方法中使用一个Model(org.springframework.ui.Model)的形参,参数名任意,比如为model的形参,可以通过model.setAttribute(String key, Objcet value)设置参数,在视图层通过EL表达式${key}即可获取
③方法中使用一个Model的形参,参数名任意,比如为model的形参,可以通过model.setAttribute(Objcet value)设置参数,该方法是以value的数据类型作为key设置属性,比如value为String时,可通过${string}来获取;value为User时,可通过${user}来获取
④在方法中使用@ModelAttribute("user")User user,则的jsp视图层可通过添加
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
之后,使用form标签
<form:form modeAttribute="user" method="pose">
<!--这里是表单元素,提交后各个属性值会自动封装到user属性中,处理此表单的Controllerr的方法,就可以直接使用User user作为形参来获得提交的对象-->
</form:form>

  • 点赞
  • 收藏
  • 分享
粉丝 17
博文 235
码字总数 68716