文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考。这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出。最后会把代码 GitHub 地址贴出来,如果有的小伙伴需要完整的配置信息,可以参考。
一、环境准备
1.1在pom.xml
中添加对应的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
1.2在web.xml
中配置前端控制器与编码过滤器
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.3配置SpringMVC的配置文件spring-mvc.xml
SpringMVC 提供了MultipartResolver
来实现文件的上传功能,MultipartResolver
是一个接口,实现类有两个:
SpringMVC 并没有装配这两个实现类,所以需要我们自动配置,这里以CommonsMultipartResolver
为例。
<!-- 用于自动配置 -->
<mvc:annotation-driven/>
<!-- 用于处理静态资源 -->
<mvc:default-servlet-handler/>
<!-- 配置 Spring MVC 扫描的包 -->
<context:component-scan base-package="com.jas.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 配置试图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置 CommonsMultipartResolver 的 Bean-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置默认的字符编码 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 设置最大的上传限制,单位是字节 -->
<property name="maxUploadSize" value="1024000"/>
</bean>
二、文件上传
分析:图片上传成功后随即跳转到文件下载页面,为了简单的实现功能,上传与下载并没有与数据库交互,可以根据需求将文件上传的路径存在数据库中,显示与下载文件的时候再向数据库中得到文件所在的路径。
2.1编写文件上传相关的JSP
fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<header>
<title>文件上传</title>
</header>
<body>
<h2>文件上传</h2>
<form action="upload" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>文件描述:</td>
<td><input type="text" name="description"></td>
</tr>
<tr>
<td>请选择文件:</td>
<td><input type="file" name="file"></td>
</tr>
<tr>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
2.2编写后台控制器代码
@RequestMapping("/upload")
public String upload(HttpServletRequest request, String description, MultipartFile file) throws Exception {
if(!file.isEmpty()) {
// 定义文件上传的路径
String path = request.getServletContext().getRealPath("/images/");
// 获得上传文件名
String fileName = file.getOriginalFilename();
File filepath = new File(path, fileName);
// 判断路径是否存在,如果不存在就创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
// 将上传文件保存到目标文件中
file.transferTo(new File(path + File.separator + fileName));
// 将上传图片描述信息与文件名保存在转发域中,用于下载
request.setAttribute("description", description);
request.setAttribute("fileName", fileName);
return "success";
} else {
return "error";
}
}
(文件上传完)
2.3上传分析
在上传文件的时候使用了MultipartFile
对象,SpringMVC 会将上传的文件绑定在MultipartFile
对象中,这个对象提供了一些方法来获得文件的内容,比如:getOriginalFilename()
用于获得文件名,transferTo(File dest)
用于将上传的文件保存在目的磁盘中。下面是其所提供的方法:
三、文件下载
3.1编写文件下载相关的JSP
success.jsp
文件上传成功后就会跳转到该页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>文件下载</title>
</head>
<body>
<h2>文件上传成功!点击即可下载上传的文件!</h2>
<span>${description}</span>
<a href="download?fileName=${fileName}"> ${fileName}</a>
</body>
</html>
3.2编写后台控制器代码
@RequestMapping(value="/download")
public ResponseEntity<byte[]> download(HttpServletRequest request, String fileName)throws Exception {
// 获得下载文件路径
String path = request.getServletContext().getRealPath("/images/");
// 对中文文件名进行转码
fileName = new String(fileName.getBytes("iso-8859-1"),"UTF-8");
File file = new File(path + File.separator + fileName);
// 文件下载的时候将文件名转码成浏览器可以识别的 ASCII
String downLoadFileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment", downLoadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers, HttpStatus.CREATED);
}
(文件下载完)
四、测试上传与下载
PS:请忽略 tomcat 的端口号,为了方便我改成了80
端口,文件下载直接点击对应的连接即可。
不知道有没有小伙伴对上传的路径感到困惑,文件上传成功了,但是在当前工程下并没有保存文件的文件夹,其实是因为项目是通过服务器运行的(这里是 tomcat),上传的文件并没有消失,而是被保存在了服务器发布的项目中。
为了防止出现太多的无效代码,省去了一些类的定义与配置文件的头信息,如果你需要这些信息,可以到 GitHub 中查看。
GitHub 地址:https://github.com/coderjas/spring-note,springmvc-fileupload2download
目录下是这个 demo 对应的代码。
参考博文:
https://blog.csdn.net/qian_ch/article/details/69258465