springboot文件上传小demo
一、准备前端页面
<form action="路径...." method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
注意
:
- 表单提交方式必须是post
- 表单的enctype属性必须为multipart/form-data
- 后台接受变量名字要与文件选择name属性一致
二、编写Controller
方式一:war包部署使用
/**
* 用来测试文件上传 - 这种方式:不能用于jar包部署
* 注意:这种方式存在局限性,不推荐在使用这种方式进行文件上传了
* @return
*/
@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";
}
方式二:适合于jar、war包部署
配置yml文件:
spring:
servlet:
multipart: #修改文件上传的大小限制
max-request-size: 120MB #运行请求传递文件大小最大为10M
max-file-size: 120MB #运行服务器可以处理的最大文件大小
# 指定文件上传位置
file:
upload:
dir: /Users/hao/upload #指定本地测试上传目录
@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";
}
总结
方式二比方式一更加适合,因为在linux服务器下执行springboot项目的时候,springboot内嵌了tomcat服务器,直接可以使用java -jar 执行项目。但是war包就不同了,war包必须在linux服务器下的tomcat容器中将war包解压之后进行执行,这时候可以访问到项目的路径,所以方式一才得以执行,方法二的jar包访问不到项目内的文件夹,所以无法上传到项目里面去。