文件上传在项目当中非常常见。基本上就是通过流进行文件的传送,在springboot当中文件上传也是非常简单。
第一步 pom文件内容
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
第二步 application配置信息
# 是否支持批量上传 (默认值 true)
spring.servlet.multipart.enabled=true
# 上传文件的临时目录 (一般情况下不用特意修改)
spring.servlet.multipart.location=
# 上传文件最大为 1M (默认值 1M )
spring.servlet.multipart.max-file-size=1MB
# 上传请求最大为 10M(默认值10M)
spring.servlet.multipart.max-request-size=10MB
# 文件大小阈值,当大于这个阈值时将写入到磁盘,否则存在内存中,(默认值0 一般情况下不用特意修改) spring.servlet.multipart.file-size-threshold=0
注:如果上传的文件大小超过默认值会报错:org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededExcep
第三步 后台上传代码
@RestController
@RequestMapping("/upload")
public class UploadController extends BaseController {
@Value("${hjljy-upload-path}")
private String uploadPath;
@PostMapping("/upload1") public AjaxJson upload1(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
File targetFile = new File(uploadPath);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
try {
FileOutputStream out = new FileOutputStream(uploadPath + file.getOriginalFilename());
out.write(file.getBytes());
out.flush(); out.close();
} catch (IOException e) {
logger.error("文件上传错误:"+e.getMessage());
} AjaxJson ajaxJson = new AjaxJson();
HashMap list =new HashMap<>();
list.put("src", "/files/"+file.getOriginalFilename());
ajaxJson.setSuccessData(list);
return ajaxJson;
}
}
注意事项:代码中的 uploadPath 的值是外部文件夹:
hjljy-upload-path =/var/uploaded_files/
这是因为在使用springboot项目时,最后打包成jar运行时,每次运行jar都会新生成一个tomcat文件夹。之前上传的文件就获取不到了。所以需要在外部固定一个文件夹当成上传文件夹。
同时需要添加代码:
@Component
public class WebConfigurer implements WebMvcConfigurer {
@Value("${hjljy-upload-path}")
private String uploadPath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**").addResourceLocations("file://"+uploadPath);
}
}
代码的含义是:添加一个外部静态资源映射:所有的/files/** 请求会到uploadPath下面去找对应的静态资源。
例如:127.0.0.1/files/bg01.jpg这个请求实际的文件查找路径是找uploadPath下面的bg01.jpg这个图片。
以上一个简单的文件上传就搞定了。
2019年6月
注意事项:
1 在项目添加了外部静态资源映射后,如果项目有shiro等权限拦截器,还需要对静态资源路径放行。
2 uploadPath必须要用/闭合起来,如果uploadPath=/var/test 是会找不到静态资源的,正确方式 uploadPath=/var/test/