文章目录
- 一:文件的上传:
- 1、添加需要的jar包:
- 2、修改spring-mvc.xml 配置文件,定义文件上传解析器:
- 3、编写文件上传Controller方法:
- 4、编写文件上传的from表单(jsp页面):
- 二:文件的下载:
- 1、文件下载的方法代码如下:
- 2、编写文件下载的jsp页面,代码如下:
- 3、测试
- 附:完整的代码:
- Controller层:
- jsp页面:
- spring-mvc.xml:
一:文件的上传:
1、添加需要的jar包:
首先,如果需要在SpringMVC中进行文件的上传与下载需要添加两个jar包,将这两个jar包拷贝到项目的lib目录,如图所示:
2、修改spring-mvc.xml 配置文件,定义文件上传解析器:
即向SpringMVC配置文件spring¬mvc.xml中添加文件上传的相关配置。因为文件不可能无限大的上传,所以一定要设置文件大小的限制。而且id是固定的,可以到org.springframework.web.servlet.DispatcherServlet的源码文件下查看,CommonsMultipartResolver提供三个属性设置,可以跳转到源码开头的注释查看,配置代码如下:
<!-- 文件上传的配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上传文件的总大小不能超过2MB=2097152字节=1024*1024*2。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="2097152"/>
<!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
3、编写文件上传Controller方法:
文件上的方法代码如下:
在控制器中,SpringMVC 中使用 MultipartFile 对象来接收上传的文件,通过这个对象可以接收页面传递的文件的文件名和文件类型,这里,参数的名字必须与页面上file组件的name属性值一致,此时,在控制器中,已经能够正常地接收页面上传的文件了,下一步,只需要把接收的这个文件,保存到你指定的路径即可。
4、编写文件上传的from表单(jsp页面):
编辑文件上传的表单代码如下:
二:文件的下载:
1、文件下载的方法代码如下:
2、编写文件下载的jsp页面,代码如下:
3、测试
(1)启动项目,访问http://127.0.0.1:8080/Demo05SpringMVC/FileDemo/toUpload.do ,选择文件,然后点击“上传文件”按钮。如图所示:
(2)文件上传成功信息,如图所示:
(3)点击文件下载链接,下载文件。如图所示:
(4)下载之后去看你设置的下载路径,就能看到下载的文件啦:
附:完整的代码:
Controller层:
package com.gx.web;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
/**
* 先引入两个jar,然后去spring-mvc.xml配置上传信息
* @author Administrator
*
*/
@Controller
@RequestMapping("/FileDemo")
public class FileDemoController {
/**
* 打开上传文件的表单
* @return
*/
@RequestMapping("/toUpload")
public String toUpload(){
return "/fileDemo/upload";
}
//文件上传
@RequestMapping("/upload")
public ModelAndView upload(@RequestParam(value="file",required=true) MultipartFile myFile) throws IOException{
String strFileName="";
//判断是否上传文件
if (myFile.isEmpty()) {
System.out.println("未上传文件");
} else {
//获取上传文件的属性
System.out.println("文件大小"+myFile.getSize());
System.out.println("文件类型"+myFile.getContentType());
System.out.println("文件名称"+myFile.getName());
System.out.println("文件原名"+myFile.getOriginalFilename());
System.out.println("===========================================");
//文件上传路径
String upDir="F:/z/";
//获取文件原名
String fullName=myFile.getOriginalFilename();
//获取扩展名称
String ext=fullName.substring(fullName.lastIndexOf('.'));
//拼接文件保存的名称
String FileName=System.nanoTime()+ext;
//保存文件
FileUtils.writeByteArrayToFile(new File(upDir, FileName), myFile.getBytes());
System.out.println("保存的文件名称为:"+FileName);
strFileName=FileName;
}
//路径为/WEB-INF/jsp/fileDemo/uploadSuccess
ModelAndView mv=new ModelAndView("/fileDemo/uploadSuccess");//由于在spring-mvc配置文件中配置了对模型视图名称的解析,所以这里路径可以简写,具体配置见下文详细代码。
mv.addObject("fileName", strFileName);
return mv;
}
//文件下载
@RequestMapping("/download")
public ResponseEntity<byte[]> download(String fileName) throws IOException {
//文件上传路径
String upDir="F:/z/";
//获取文件
File file = new File(upDir,fileName);
//设置header
HttpHeaders headers = new HttpHeaders();
//application/octet-stream二进制流数据(最常见的文件下载)
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//通知浏览器以attachment(下载方式) 下载文件,文件名称为指定名称
headers.setContentDispositionFormData("attachment", fileName);
//返回文件下载相关参数
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
}
jsp页面:
```java
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set value="${pageContext.request.contextPath}" scope="page" var="ctx"></c:set>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'upload.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>
<!-- 需要指定enctype="multipart/form-data" 不然文件上传不了 -->
<form action="${ctx}/FileDemo/upload.do" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file"><!-- name值需要和控制器那边(value="file")对应 -->
<button type="submit">上传文件</button>
</form>
</body>
</html>
```java
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set value="${pageContext.request.contextPath}" scope="page" var="ctx"></c:set>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'uploadSuccess.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>
上传成功<br>
<a href="${ctx}/FileDemo/download.do?fileName=${fileName}">${fileName}</a>
</body>
</html>
spring-mvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!-- 日期转换 必须放在<mvc:annotation-driven />前面 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
<!-- 注解方式 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 自动扫描且只扫描 @Controller -->
<context:component-scan base-package="com.gx.web">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<!-- 跳转的时候只用写jsp的名字,不用带后缀,因为默认后缀“.jsp”,路径为“/WEB-INF/jsp” -->
<!-- WEB-INF目录是受保护的目录,在浏览器中是无法访问的 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 文件上传的配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上传文件的总大小不能超过2MB=2097152字节=1024*1024*2。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="2097152"/>
</bean>
</beans>