前言
用户访问当前系统,将自己本地计算机中文件通过浏览器上传到当前系统所在的服务器过程中称之为文件的上传
具体思路
1.文件上传
文件上传: 用户将本地计算机中文件上传到服务器过程称之为文件上传
2.文件上传开发思路:
- a.提供一张上传页面 提交方式必须:post enctype属性必须为 multipart/form-data
- b.开发上传controller
第一种文件上传方式
整体做法
准备上传页面
<form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传文件">
</form>
<!--
1. 表单提交方式必须是post
2. 表单的enctype属性必须为multipart/form-data
3. 后台接受变量名字要与文件选择name属性一致
-->
当用户选择一个文件并点击“上传文件”按钮时,会向 /file/upload 接口发送一个 POST 请求,并携带上传的文件。
编写控制器
@RequestMapping("upload")
public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
//定义:接收文件对象 multipartFile file变量名要与form中input type="file"标签name属性名一致
//文件名
String originalFilename = file.getOriginalFilename(); //得到文件名字
log.debug("文件名: {}", originalFilename);
log.debug("文件大小: {}", file.getSize());
log.debug("文件类型: {}", file.getContentType());
//1.根据相对 上传 "upload" 获取绝对路径(真实路径) /users/桌面.... 服务器: /home/springboot_day4..
String realPath = request.getSession().getServletContext().getRealPath("/upload");
log.debug("获取绝对路径: {}", realPath);
//2.上传文件 参数1: 将文件写入到那个目录 aa.txt .md xxx.xxx.xxx.md
//修改文件名
String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ext;
file.transferTo(new File(realPath, newFileName));
return "redirect:/upload.jsp";
}
接收前端上传的文件,并获取文件的相关信息。
生成新的文件名,并保存文件到服务器上指定的目录下。
上传成功后,重定向到 /upload.jsp 页面
修改文件上传大小
servlet:
multipart: #修改文件上传的大小限制
max-request-size: 120MB #运行请求传递文件大小最大为10M
max-file-size: 120MB #运行服务器可以处理的最大文件大小
第二种文件上传
因为springboot推荐使用jar包的项目部署,我们第二种方式无论是jar包和war部署都能够找到文件上传的目录
准备上传页面
<form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传文件">
</form>
<!--
1. 表单提交方式必须是post
2. 表单的enctype属性必须为multipart/form-data
3. 后台接受变量名字要与文件选择name属性一致
-->
编写控制器
@Value("${file.upload.dir}")
private String realPath;
/**
* 第二种文件上传
* 注意: 这种方式适用于任何一种部署方式 推荐使用这种方式
* @param file
* @return
* @throws IOException
*/
@RequestMapping("uploadByJarDeploy")
public String uploadByJarDeploy(MultipartFile file) throws IOException {
//文件名
String originalFilename = file.getOriginalFilename();
log.debug("文件名: {}", originalFilename);
log.debug("文件大小: {}", file.getSize());
log.debug("文件类型: {}", file.getContentType());
//改名
String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ext;
//上传文件到哪
file.transferTo(new File(realPath,newFileName));
return "redirect:/upload.jsp";
}
指定文件上传路径
#指定文件上传的位置
file:
upload:
dir: D:\Study\java\practical-projects\spring-boot\springbootAopTest\src\main\webapp\upload //这里就是你自己服务器的具体目录
总结
为什么我要介绍两种上传思路,就是因为在我们springboot中推荐使用jar包,War包文件代表了一个Web应用程序,把WAR文件作为部署单元来使用,主要是自带本地的Tomcat,但springboot内部集成了tomcat,如果用第一种方式,当项目打包到服务器的时候,目录结构就会发生变化,使用了第二种方式之后,我们就根据自己的需求配置文件上传的目录。