SpringMVC 上传&下载
# SpringMVC 上传&下载
# 上传
SpringMVC框架 文件上传是基于 commons-fileupload
组件 ,并且对该组件 进一步的封装。文件上传提供支持可直接 用 MultpartResolver
接口 。该接口用于处理上传请求,请求包装成 可直接获取文件的数据!!
MultpartResolver
接口方法:
public interface MultipartFile extends InputStreamSource {
// 返回请求参数的名称
String getName();
// 返回客户端提交的原始文件名称
@Nullable
String getOriginalFilename();
// 返回文件内容类型
@Nullable
String getContentType();
// 判断被上传文件是否为空
boolean isEmpty();
// 文件大小 ;单位字节
long getSize();
// 以字节数组形式返回文件的内容
byte[] getBytes() throws IOException;
// 读取文件的内容
@Override
InputStream getInputStream() throws IOException;
default Resource getResource() {
return new MultipartFileResource(this);
}
// 将上传文件保存都目标目录下
void transferTo(File dest) throws IOException, IllegalStateException;
default void transferTo(Path dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(getInputStream(), Files.newOutputStream(dest));
}
}
上传组件&构架
项目结构(主要部分)
.
|
├── com
│ ├── controller
| | └── FileController
│ ├── interceptor
| | └── Fileinterceptor
| User
|
└── webapp
└── jsp
├── fileHandle.jsp
└── ok.jsp
依赖导入
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
# 文件上传
springmvc.xml
文件配置 MultipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
fileHandle.jsp
页面表单(上传表单编码类型必须multipart/form-data
)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件操作</title>
</head>
<body>
<form action="/file/upload" method="post" enctype="multipart/form-data">
请选择文件:<input type="file" name="myFile" /><br/>
<button type="submit">上传文件</button>
</form>
</body>
</html>
<!--
表单 enctype属性 说明: 表单数据的编码方式
- application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的 value 属性值
- multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里
- text/plain:该编码方式只有当表单的 action 属性为“mailto:”URL 的形式时才使用,主要适用于直接通过表单发送邮件的方式
-->
FileController
类 控制器类
/**
* 单个文件上传
*/
@RequestMapping("upload")
public String upload(@RequestParam("myFile") MultipartFile file, HttpServletRequest request) throws IOException {
//文件路径及文件名称
String realPath = request.getServletContext().getRealPath("uploadfiles");
// 文件原始名称
String fileName = file.getOriginalFilename();
System.out.println("fileName : " + fileName);
System.out.println("realPath : " + realPath);
File targetFile = new File(realPath,fileName);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
//真正上传到服务器指定的名称
file.transferTo(targetFile);
System.out.println("上传成功:"+realPath+fileName);
return "jsp/ok";
}
# 优化上传
FileController
类 控制器类
意图:实际开发中,一般都要将文件重新命名存储(避免相同名称)
/**
* 上传文件
* @param file 请求中接收的上传文件
* @return 跳转页
*/
@RequestMapping("upload")
public String upload(@RequestParam("myFile") MultipartFile file, HttpServletRequest request) throws IOException {
//获取文件原始名称 (包含后缀)
String originalFilename = file.getOriginalFilename();
//randomUUID()生成随机数;replace()替换指定字符
//存储服务器的名称 = 随机字符串 + 原文件后缀
String fileName = UUID.randomUUID().toString().replace("-","") + originalFilename.substring(originalFilename.lastIndexOf("."));
//存储路径
String realPath = request.getServletContext().getRealPath("/uploadFile")+"\\";
//存储路径 路径 + 文件名称
file.transferTo(new File(realPath+fileName));
System.out.println("上传成功:"+realPath+fileName);
return "jsp/ok";
}
springmvc.xml
配置文件
意图:限制文件的大小
<!-- 上传文件-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--限制文件大小(单位:字节)1024*1024*5 KB : 5MB = -->
<property name="maxUploadSize" value="5242880"/>
<property name="defaultEncoding" value="utf-8"/>
</bean>
Fileinterceptor
拦截器类
意图:限制文件后缀形式
应用前提需配置拦截器 springmvc.xml
<mvc:interceptors>
····
<!--指定干活的拦截器(判断上传文件类型)-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.interceptor.Fileinterceptor" id="fileinterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
public class Fileinterceptor implements HandlerInterceptor {
/**
* 在文件上传之前判定文件是否合法
* @param request
* @param response
* @param handler
* @return 是否允许请求通行
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handler) throws Exception {
boolean flag = true;
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
//获取请求返回的 多个文件
Map<String, MultipartFile> fileMap = multipartHttpServletRequest.getFileMap();
//遍历文件
Iterator<String> iterator = fileMap.keySet().iterator();
while(iterator.hasNext()){
String key = iterator.next();
MultipartFile file = multipartHttpServletRequest.getFile(key);
//查看 原始文件名
String originalFilename = file.getOriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
//判断后缀许可
if (!substring.equalsIgnoreCase(".png") && !substring.equalsIgnoreCase(".jpg")) {
//不符合条件的
request.getRequestDispatcher("/jsp/fileTypeError.jsp").forward(request,response);
flag = false;
}
}
}
return flag;
}
}
# 下载
前端下载请求
<form action="/file/download" method="post" enctype="multipart/form-data">
<button type="submit">下载</button>
</form>
FileController
类 控制器类
/**
* 下载文件
* @return 字节形式传输
*/
@RequestMapping("download")
public ResponseEntity<byte[]> download(HttpServletRequest request) throws IOException {
//指定文件名
String fileName = "5593fe61c683494a91849c0346b2b528.jpg";
//指定 文件名及文件路径(下载文件的路径)
String path = request.getServletContext().getRealPath("/uploadFile")+"/"+fileName;
//创建响应 的头信息对象
HttpHeaders httpHeaders = new HttpHeaders();
//标记的流方式作出响应
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//以附件形式响应给用户
httpHeaders.setContentDispositionFormData("attachment", URLEncoder.encode(fileName,"utf-8"));
File file = new File(path);
ResponseEntity<byte[]> resp = new ResponseEntity<>(FileUtils.readFileToByteArray(file),httpHeaders, HttpStatus.CREATED);
return resp;
}
上次更新: 2023/03/12, 00:43:49