文档章节

Spring MVC、文件上传下载

木子丰
 木子丰
发布于 2013/11/27 11:07
字数 1176
阅读 2374
收藏 25

相关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
博文 236
码字总数 68754
作品 0
郑州
程序员
私信 提问
文件的上传和下载--SpringMVC

文件的上传和下载是项目开发中最常用的功能,例如图片的上传和下载、邮件附件的上传和下载等。 接下来,将对Spring MVC环境中文件的上传和下载进行详细的讲解。 一.文件上传 多数文件上传都...

一飞要上天
08/23
0
0
fastupload-springmvc 0.5.5 发布

fastupload-springmvc是利用fastupload开源组件Spring MVC框架写的文件上传插件,使用此插件,能在Controller中以注解的方式来获取上传的文件,然后对其进行操作。比使用fastupload核心API更...

仪山湖
2013/04/15
1K
8
Spring MVC 之基本配置和请求流程

Spring MVC 基本配置项 SpringMVC是目前Web程序和前端数据交互的框架,包括文件上传,静态资源下载,api接口数据返回等,主要是配置一个spring-mvc.xml的配置文件,这个配置文件是给org.spr...

满小茂
2016/07/05
0
0
Spring MVC 3 : 一次上传多个文件

在 Spring 3 里,是可以直接上传一个文件的。然后,对于如何在一个 jsp 文件里上传多个文件却几乎没有任何帮助文档。 要上传多个文件,这有三件基本的事情需要完成: a) JSP 文件里必须有 in...

Tom-Lin
2013/03/05
8.4K
4
Spring 3.x Web MVC

本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1142 Spring 3.x Web MVC Spring mvc 特点 @ 功能组件划分细致 @ 灵活、强大 @ 设计思想优秀 MVC框......

智慧点点
08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

自定义 Maven 的 repositories

有时,应用中需要一些比较新的依赖,而这些依赖并没有正式发布,还是处于milestone或者是snapshot阶段,并不能从中央仓库或者镜像站上下载到。此时,就需要 自定义Maven的<repositories>。 ...

waylau
42分钟前
1
0
徒手写一个es6代码库

mkdir democd demonpm initnpm install -g babelnpm install -g babel-clinpm install --save-dev babel-preset-es2015-node5 在项目目录创建两个文件夹 functional-playground ......

lilugirl
43分钟前
2
0
linux定位应用问题的一些常用命令,特别针对内存和线程分析的dump命令

1.jps找出进程号,找到对应的进程号后面才好继续操作 2.linux查看进程详细信息 ps -ef | grep 进程ID 3. dump内存信息 Jmap -dump:format=b,file=YYMMddhhmm.dump pid 4.top查看cpu占用信息 ...

noob_chr
43分钟前
1
0
Android TV开发-按键焦点

写在前面 按键焦点过程了解 2.1 dispatchKeyEvent 过程了解 2.2 焦点查找请求过程了解 1.2.1 第一次获取焦点 1.2.3 按键焦点 焦点控制 焦点记忆 应用场景 参考资料 [TOC] 1. 写在前面 工...

冰雪情缘l
43分钟前
1
0
java框架学习日志-3

这章主要是补充一些ioc创建对象的方式,ioc容器在写好<bean></bean>的时候就已经创建对象了。在之前的例子中,一直都是无参的构造方法。下面给出有参的构造方法的对象的创建,没有什么难点重...

白话
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部