文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考。这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出。最后会把代码 GitHub 地址贴出来,如果有的小伙伴需要完整的配置信息,可以参考。
pom.xml
中添加对应的依赖 <dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>4.3.16.RELEASEversion>
dependency>
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jsp-apiartifactId>
<version>2.0version>
<scope>providedscope>
dependency>
web.xml
中配置前端控制器与编码过滤器 <servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-mvc.xmlparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>characterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
spring-mvc.xml
SpringMVC 提供了MultipartResolver
来实现文件的上传功能,MultipartResolver
是一个接口,实现类有两个:
SpringMVC 并没有装配这两个实现类,所以需要我们自动配置,这里以CommonsMultipartResolver
为例。
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<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>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="1024000"/>
bean>
分析:图片上传成功后随即跳转到文件下载页面,为了简单的实现功能,上传与下载并没有与数据库交互,可以根据需求将文件上传的路径存在数据库中,显示与下载文件的时候再向数据库中得到文件所在的路径。
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>
@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";
}
}
(文件上传完)
在上传文件的时候使用了MultipartFile
对象,SpringMVC 会将上传的文件绑定在MultipartFile
对象中,这个对象提供了一些方法来获得文件的内容,比如:getOriginalFilename()
用于获得文件名,transferTo(File dest)
用于将上传的文件保存在目的磁盘中。下面是其所提供的方法:
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>
@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