springMvc文件上传下载

文件上传和下载

使用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);
	}


springMvc使用消息转换器ByteArrayHttpMessageConverter设置文件内容为响应体,通过设置响应头ContentDisposition通知浏览器下载的附近名称

	@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

显示



点击图片即可下载


添加-上传




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值