利用SpirngBoot实现文件上传功能

零、本篇要点

  • 介绍SpringBoot对文件上传的自动配置 。
  • 介绍MultipartFile接口 。
  • 介绍SpringBoot+Thymeleaf文件上传demo的整合 。
  • 介绍对文件类型 , 文件名长度等判断方法 。
一、SpringBoot对文件处理相关自动配置自动配置是SpringBoot为我们提供的便利之一 , 开发者可以在不作任何配置的情况下 , 使用SpringBoot提供的默认设置 , 如处理文件需要的MultipartResolver 。
@Configuration(proxyBeanMethods = false)@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)@ConditionalOnWebApplication(type = Type.SERVLET)@EnableConfigurationProperties(MultipartProperties.class)public class MultipartAutoConfiguration { private final MultipartProperties multipartProperties; public MultipartAutoConfiguration(MultipartProperties multipartProperties) {this.multipartProperties = multipartProperties; } @Bean @ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class }) public MultipartConfigElement multipartConfigElement() {return this.multipartProperties.createMultipartConfig(); } @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) @ConditionalOnMissingBean(MultipartResolver.class) public StandardServletMultipartResolver multipartResolver() {StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());return multipartResolver; }}
  • Spring3.1之后支持StandardServletMultipartResolver , 且默认使用StandardServletMultipartResolver , 它的优点在于:使用Servlet所提供的功能支持 , 不需要依赖任何其他的项目 。
  • 想要自动配置生效 , 需要配置spring.servlet.multipart.enabled=true , 当然这个配置默认就是true 。
  • 相关的配置设置在MultipartProperties中 , 其中字段就是对应的属性设置 , 经典字段有:enabled:是否开启文件上传自动配置 , 默认开启 。 location:上传文件的临时目录 。 maxFileSize:最大文件大小 , 以字节为单位 , 默认为1M 。 maxRequestSize:整个请求的最大容量 , 默认为10M 。 fileSizeThreshold:文件大小达到该阈值 , 将写入临时目录 , 默认为0 , 即所有文件都会直接写入磁盘临时文件中 。 resolveLazily:是否惰性处理请求 , 默认为false 。
  • 我们也可以自定义处理的细节 , 需要实现MultipartResolver接口 。
二、处理上传文件MultipartFile接口SpringBoot为我们提供了MultipartFile强大接口 , 让我们能够获取上传文件的详细信息 , 如原始文件名 , 内容类型等等 , 接口内容如下:
public interface MultipartFile extends InputStreamSource {String getName(); //获取参数名@NullableString getOriginalFilename();//原始的文件名@NullableString getContentType();//内容类型boolean isEmpty();long getSize(); //大小byte[] getBytes() throws IOException;// 获取字节数组InputStream getInputStream() throws IOException;//以流方式进行读取default Resource getResource() {return new MultipartFileResource(this);}// 将上传的文件写入文件系统void transferTo(File var1) throws IOException, IllegalStateException; // 写入指定pathdefault void transferTo(Path dest) throws IOException, IllegalStateException {FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));}}三、SpringBoot+Thymeleaf整合demo1、编写控制器/** * 文件上传 * * @author Summerday */@Controllerpublic class FileUploadController {private static final String UPLOADED_FOLDER = System.getProperty("user.dir");@GetMapping("/")public String index() {return "file";}@PostMapping("/upload")public String singleFileUpload(@RequestParam("file") MultipartFile file,RedirectAttributes redirectAttributes) throws IOException {if (file.isEmpty()) {redirectAttributes.addFlashAttribute("msg", "文件为空,请选择你的文件上传");return "redirect:uploadStatus";}saveFile(file);redirectAttributes.addFlashAttribute("msg", "上传文件" + file.getOriginalFilename() + "成功");redirectAttributes.addFlashAttribute("url", "/upload/" + file.getOriginalFilename());return "redirect:uploadStatus";}private void saveFile(MultipartFile file) throws IOException {Path path = Paths.get(UPLOADED_FOLDER + "/" + file.getOriginalFilename());file.transferTo(path);}@GetMapping("/uploadStatus")public String uploadStatus() {return "uploadStatus";}}2、编写页面file.html文件上传界面
3、编写页面uploadStatus.html文件上传界面