文档章节

Spring MVC、文件上传下载

木子丰
 木子丰
发布于 2013/11/27 11:07
字数 1176
阅读 2376
收藏 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>

© 著作权归作者所有

木子丰
粉丝 18
博文 238
码字总数 68903
作品 0
郑州
程序员
私信 提问
文件的上传和下载--SpringMVC

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

一飞要上天
2018/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
(十七)JAVA springcloud ssm b2b2c多用户商城系统-上传文件

这篇文章主要介绍,如何在springboot工程作为服务器,去接收通过http 上传的multi-file的文件。 构建工程 为例创建一个springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-st...

sccspuercode
01/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 看来我只适合当一个千斤顶

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《我想我是伟大的》 《我想我是伟大的》- 九天 手机党少年们想听歌,请使劲儿戳(这里) 最近面试的好多呀, 面试了一个漂...

小小编辑
20分钟前
194
7
grafana安装使用及与zabbix集成

grafana简介 Grafana是一个完全开源的度量分析与可视化平台,可对来自各种各种数据源的数据进行查询、分析、可视化处理以及配置告警。 Grafana支持的数据源: 官方:Graphite,InfluxDB,Ope...

阿dai学长
52分钟前
12
0
带你看数据挖掘与机器学习-厦大EDP上课出勤预测

带你看数据挖掘与机器学习-厦大EDP上课出勤预测 标签: 数据挖掘 特征工程 机器学习 出勤预测 write by xmhexi 2019/3/22 内容提要 首先说明本文是一篇科普文章,通过一个实际案例,帮助理解什...

xmhexi
今天
128
0
IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
今天
5
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部