文件上传和下载
使用SpringMvc包装的解析器(CommonsMultipartResolver)进行上传控制,需要引入apache的common-fileupload组件包
1.设置表单属性
<form action="<%=path %>/fileUpload.htm" method="post" enctype="multipart/form-data">
文件 <input type="file" name="myImg"/>
</form>
2.springmvc配置文件中添加文件解析器
<!-- 名称必须使用 multipartResolver 因为spring容器使用名称注入 文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 限制上传文件大小 5M -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
3.action方法接收文件
@RequestMapping(value="/saveFood",method=RequestMethod.POST)
public String saveFood(Food food,MultipartFile imageUrl) throws Exception{
//获取文件的名字
String imagename = imageUrl.getOriginalFilename();
//将文件名存入对象 该对象的数据用于存入数据库
food.setImag(imagename);
//设置文件的存储路径 (该路径是项目发布后的路径,便于查看是用相对路径)
String absPath="E:/apache-tomcat-6.0.45/webapps/sml/images/"+imagename;
//将文件写入设置好的路径
imageUrl.transferTo(new File(absPath));
//将对象里的数据写入数据库
foodSerice.saveFood(food);
}
@RequestMapping(value="/download",method=RequestMethod.GET)
public ResponseEntity<byte[]> download(String imagePath) throws Exception{
//文件路径
String absPath="E:/apache-tomcat-6.0.45/webapps/sml/images/"+imagePath;
//需要下载的目录文件
File file = new File(absPath);
//设置响应头
HttpHeaders headers = new HttpHeaders();
//设置下载的文件的名称 转换文件名的编码
headers.setContentDispositionFormData("attachment", URLEncoder.encode(imagePath,"UTF-8"));
//读取目标文件为二进制数组
byte[] fileByte = FileCopyUtils.copyToByteArray(file);
//构建ResponseEntity对象
ResponseEntity<byte[]> re = new ResponseEntity<byte[]>(fileByte,headers,HttpStatus.CREATED);
//将对象返回
return re;
}
例:上传下载
依赖jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>SpringMvcLession</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name/>
<description/>
<dependencies>
<!-- springmvc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<!-- 加载jdbc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<!-- 加载mysql数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<!-- 文件上传下载 apache的common-fileupload组件包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>javaee-api</artifactId>
<version>5.0-1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>1.2_04</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>1.2_04</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>${basedir}/src</sourceDirectory>
<outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webappDirectory>${basedir}/WebRoot</webappDirectory>
<warSourceDirectory>${basedir}/WebRoot</warSourceDirectory>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 请求method支持put和delete必须添加过滤器 -->
<filter>
<filter-name>myFile</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFile</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--
解决乱码的配置 使用拦截器拦截/*所有路径,将请求头和响应头都设置为UTF-8
-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- 设置request 字符集 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<!-- 设置response 字符集 -->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置springmvc的核心控制器 将uri拦截下来 -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
springmvc配置(这里没有和spring配置一起使用)
<?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:p="http://www.springframework.org/schema/p"
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-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
">
<!-- 指定扫描的位置 -->
<context:component-scan base-package="cn"></context:component-scan>
<!-- springmvc 配置拦截 / 所有资源都被拦截 图片无法展示 将除控制层以外的资源交回给servlet处理 -->
<mvc:default-servlet-handler/>
<!-- 将springmvc注解的action交给springmvc处理 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 启用文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 限制上传文件大小 5M -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
<!-- 指定四要素的位置 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${url}"></property>
<property name="driverClassName" value="${driverClass}"></property>
<property name="username" value="${userid}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- 数据库连接 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
前端页面-显示-下载
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<!-- 包含公共的JSP代码片段 -->
</head>
<body>
<div id="QueryArea">
<form action="${pageContext.request.contextPath}/food" method="get">
<input type="text" name="foodname" title="请输入菜品名称" value="${param.fname}">
<input type="submit" value="搜索">
</form>
</div>
<div id="MainArea">
<table class="MainArea_Content" align="center" cellspacing="0"
cellpadding="0">
<tr align="center" valign="middle" id="TableTitle">
<td>图片</td>
<td>菜编号</td>
<td>菜名</td>
<td>价格</td>
</tr>
<c:forEach var="map" items="${requestScope.list}">
<tr class="TableDetail1">
<td><a href="${pageContext.request.contextPath}/download?imagePath=${pageScope.map.imag}"><img style='max-width:68px;width:68px;width:expression(width>68?"68px":width "px");max-width: 68px;' src="${pageContext.request.contextPath}/images/${pageScope.map.imag}"/></a></td>
<td>${pageScope.map.foodid }</td>
<td>${pageScope.map.foodname}</td>
<td>${pageScope.map.price}</td>
</tr>
</c:forEach>
<a href="${pageContext.request.contextPath}/saveFood.jsp">增加</a>
</table>
</div>
</body>
</html>
添加-上传
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'saveFood.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!-- 文件上传
表单 必须是post
设置编码格式 application/x-www-form-urlencoded(不支持文件上传)
multipart/form-data(支持文件上传)
enctype="multipart/form-data"
文件选择框 input type="file"
-->
<form action="<%=path%>/saveFood" method="post" enctype="multipart/form-data">
图片:<input type="file" name="imageUrl" /> <br/>
菜单名:<input type="text" name="foodname"/> <br/>
菜单价格:<input type="text" name="price"/> <br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
控制层
package cn.et.controller;
import java.io.File;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import cn.et.conf.Food;
import cn.et.serice.FoodSerice;
@Controller
public class FoodController {
@Autowired
FoodSerice foodSerice;
@RequestMapping(value="/food",method=RequestMethod.GET)
public String queryFood(String foodname,Model model){
List<Map<String,Object>> list = foodSerice.queryFood(foodname);
model.addAttribute("list", list);
return "/foodList.jsp";
}
/**
* 添加菜品 上传
* @param food
* @param imageUrl
* @return
* @throws Exception
*/
@RequestMapping(value="/saveFood",method=RequestMethod.POST)
public String saveFood(Food food,MultipartFile imageUrl) throws Exception{
//获取文件的名字
String imagename = imageUrl.getOriginalFilename();
//将文件名存入对象 该对象的数据用于存入数据库
food.setImag(imagename);
//设置文件的存储路径 (该路径是项目发布后的路径,便于查看是用相对路径)
String absPath="E:/apache-tomcat-6.0.45/webapps/sml/images/"+imagename;
//将文件写入设置好的路径
imageUrl.transferTo(new File(absPath));
//将对象里的数据写入数据库
foodSerice.saveFood(food);
return "/foodList.jsp";
}
/**
* 下载文件
* @param imagePath
* @return
* @throws Exception
*/
@RequestMapping(value="/download",method=RequestMethod.GET)
public ResponseEntity<byte[]> download(String imagePath) throws Exception{
//文件路径
String absPath="E:/apache-tomcat-6.0.45/webapps/sml/images/"+imagePath;
//需要下载的目录文件
File file = new File(absPath);
//设置响应头
HttpHeaders headers = new HttpHeaders();
//设置下载的文件的名称 转换文件名的编码
headers.setContentDispositionFormData("attachment", URLEncoder.encode(imagePath,"UTF-8"));
//读取目标文件为二进制数组
byte[] fileByte = FileCopyUtils.copyToByteArray(file);
//构建ResponseEntity对象
ResponseEntity<byte[]> re = new ResponseEntity<byte[]>(fileByte,headers,HttpStatus.CREATED);
//将对象返回
return re;
}
}
jdbc
url=jdbc\:mysql\://localhost\:3306/desk
driverClass=com.mysql.jdbc.Driver
userid=root
password=123456
显示
点击图片即可下载
添加-上传