文件上传
Spring MVC 对于文件上传提供了 MultipartResolver 解析器支持,Spring 使用 Jakarta Commons FileUpload 实现了一个 MultipartResovler 的实现类:CommonsMultipartResolver;
在 Spring MVC 中使用文件上传模块,需要导入以下的依赖库:
commons-fileupload:commons-fileupload
commons-io:commons-io
同时需要在 spring-mvc 上下文配置文件中装配一个 MultipartResolver,如下:
<!--配置文件上传解析器-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8"
p:maxUploadSize="#{1024*1024*5}"
/>
其中常用参数如下:
- defaultEncoding:默认编码;
- maxUploadSize:一次表单请求中单个上传文件最大容量;
- uploadTempDir:上传临时文件存放路径,上传结束后自动删除;
- maxInMemorySize:一次请求中所有上传文件的总最大容量;
单文件上传
在文件上传的提交表单中,注意要将
enctype 属性设置为 multipart/form-data,同时设置 method 为 post;
以下是提交表单视图:uploadPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>文件上传下载页面</title>
</head>
<body>
<h1>单文件上传</h1>
<form action="<c:url value="/upload"/>" method="post" enctype="multipart/form-data">
文件 <input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
<br/>
</body>
</html>
以下为控制器:UploadController.jsp
package site.assad.web;
public class UploadController {
"/uploadPage") (
public String gotoUploadPage(){
return "/uploadPage";
}
//单文件上传
value="/upload",method=RequestMethod.POST) (
public String uploadSingle( (value="uploadFile") MultipartFile file, Model model,HttpSession session) throws IOException {
if(!file.isEmpty()){
model.addAttribute("msg","Upload File Success");
model.addAttribute("name","file name:"+file.getOriginalFilename()); //获取上传文件名
model.addAttribute("size","file size:"+file.getSize()+"bytes"); //获取上传文件大小
String uploadpath = session.getServletContext().getRealPath("./upload/");
// String uploadpath = "/C:/Al-assad/workplace/workplace-IDEA/testSpring_mvc_upload/src/main/webapp/upload"; //固定的文件路径,方便idea的内嵌tomcat调试
file.transferTo(new File(uploadpath,file.getOriginalFilename()));
}else{
model.addAttribute("msg","Upload File fail");
}
return "/result";
}
}
以下为结果视图:result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="en">
<head>
<title>Success Page</title>
</head>
<body>
<h1><c:out value="${msg}" /></h1>
<p>文件信息</p>
<c:if test="${!name.isEmpty()}">
<c:out value="${name}" />
</c:if>
<br/>
<c:if test="${!size.isEmpty()}">
<c:out value="${size}" />
</c:if>
</body>
</html>
在控制器中,可以通过文件上传参数对象,并指定为 MultipartFile 来控制上传文件的行为,Spring 提供了以下一系列方法:
byte[] getBytes() | 获取文件字节流 |
String getContentType() | 获取文件 MIME 类型,如“image/pjpeg”,“text/plain” |
InputStream getInputStream() | 获取文件输入流 |
String getName() | 获取表单中文件组件的 name 字段值 |
String getOriginalName() | 获取上传文件的文件名(包含文件后缀) |
long getSize() | 获取上传文件的字节大小(单位 byte) |
boolean isEmpty() | 检查是否有上传的文件 |
void transferTo(File dest) | 将该上传文件保存到一个目标文件中 |
多文件上传
多文件上传的步骤类似于的单文件上传;
表单提交视图部分如下:
<h1>多文件上传</h1>
<form action="<c:url value="/uploadMultiply"/>" method="post" enctype="multipart/form-data">
文件 <input type="file" name="files"/><br/>
文件 <input type="file" name="files"/><br/>
文件 <input type="file" name="files"/><br/>
<input type="submit" value="上传"/>
</form>
<br/>
控制器处理器代码如下:
//多文件上传
value="/uploadMultiply",method=RequestMethod.POST) (
public String uploadMultiply( MultipartFile[] files,Model model,HttpSession session) throws IOException {
List<FileCommand> fileList = new ArrayList<>();
String uploadpath = session.getServletContext().getRealPath("./upload/");
// String uploadpath = "/C:/Al-assad/workplace/workplace-IDEA/testSpring_mvc_upload/src/main/webapp/upload"; //固定系统路径,方便idea的内嵌tomcat调试
for(MultipartFile file : files){
fileList.add(new FileCommand(file.getOriginalFilename(),file.getSize()+"bytes"));
file.transferTo(new File(uploadpath,file.getOriginalFilename()));
}
model.addAttribute("msg","Upload File Result");
model.addAttribute("resultList",fileList);
return "/result";
}
结果视图如下:
<%--打印多文件上传信息--%>
<c:if test="${resultList != null}">
<c:forEach items="${resultList}" var="file">
file name: <c:out value="${file.fileName}"/><br/>
file size: <c:out value="${file.fileSize}"/><br/>
<br/>
</c:forEach>
</c:if>
文件下载
一个示例的文件下载如下:
文件下载入口视图:
文件下载入口视图:
<h1>文件下载</h1>
<a href="<c:url value="/download" />">下载文件</a>
控制器处理器部分:
//文件下载
value="/download") (
public ResponseEntity<byte[]> download() throws IOException {
//待下载的文件对象
String downloadPath = "/C:/Al-assad/workplace/workplace-IDEA/testSpring_mvc_upload/src/main/webapp/upload/downloadtest.jpg";
File file = new File(downloadPath);
//创建填充响应头
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachement",new String("你好啊少年.jpg".getBytes("UTF-8"),"iso-8859-1"));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}