Spring Boot上传文件

前期回顾:
创建Spring Boot项目
Spring Boot项目基础配置

本文介绍Spring Boot上传文件的两种形式,一种是解析方式是StandardServletMultipartResolver,它是基于Servlet3.0的,所以不需要依赖其他jar包,另一个组件是CommonsMultipartResolver,使用它需要额外引用其它jar包,如想了解,请继续往下看:

  • 公共引用方法:
private final static String PATH = "/data/files/";

private File buildDirectory() {
    File directory = new File(PATH);
    if (!directory.exists() || !directory.isDirectory()) {
        directory.mkdirs();
    }
    return directory;
}

private void upload(MultipartFile multipartFile, File directory) {
    File file = new File(PATH + multipartFile.getOriginalFilename());
    String filename = multipartFile.getOriginalFilename();
    //实际项目中可能会上传重名文件,但内容可能不一致,所以我们需要重置文件名称,否则原文件将丢失
    if (file.exists()) {
        filename = System.currentTimeMillis() + filename;
    }
    try {
        multipartFile.transferTo(new File(directory, filename));
    } catch (IOException e) {
        log.error("上次文件失败", e);
        throw new RuntimeException("上次文件失败");
    }
}
  • StandardServletMultipartResolver:
    配置文件:
spring:
  servlet:
    multipart:
      enabled: true
      location: /data/
      max-file-size: 1MB
      max-request-size: 5MB
      resolve-lazily: false
      file-size-threshold: 0
		enabled:开启上传文件配置;
		location:文件上传临时保存位置,没有写入最终保存位置时存放的位置;
		max-file-size:上传单个文件最大大小;
		max-request-size:上传一组文件最大大小;
		resolve-lazily:是否延迟解析,相当于懒加载;
		file-size-threshold:文件大小阈值,当大于这个阈值时将写入到磁盘,否则存在内存中,默认为0

	上传文件Java实现:
@PostMapping("/standardServletMultipartResolver")
public String standardServletMultipartResolver(@RequestParam(name = "file") MultipartFile[] multipartFiles) {
    Assert.isTrue(multipartFiles != null && multipartFiles.length > 0, "请选择文件");
    //获取保存文件磁盘的文件夹,如果不存在则创建
    File directory = buildDirectory();
    for (int i = 0; i < multipartFiles.length; i++) {
        upload(multipartFiles[i], directory);
    }
    return "上传成功!";
}
	测试:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/demo/file/standardServletMultipartResolver" method="post" enctype="multipart/form-data" target="frameName">
    <!-- multiple属性表示可上次多个文件 -->
    <input type="file" name="files" value="选择文件" multiple>
    <input type="submit" value="上传">
</form>
<!-- 提交成功后停留在原页面 -->
<iframe src="" frameborder="0" name="frameName"></iframe>
</body>
</html>
  • CommonsMultipartResolver:
    配置文件:
spring:
  servlet:
    multipart:
      enabled: false
      location: /data/
      max-file-size: 1MB
      max-request-size: 5MB
      resolve-lazily: false
      file-size-threshold: 0
	依赖:
<commons.fileupload>1.3.3</commons.fileupload>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>${commons.fileupload}</version>
</dependency>
	Java实现:
@PostMapping("/commonsMultipartResolver")
public String commonsMultipartResolver(HttpServletRequest request) {
    List<MultipartFile> multipartFiles = getFormMultipartFile(request);
    Assert.isTrue(multipartFiles != null && multipartFiles.size() > 0, "请选择需要上传的文件");
    File directory = buildDirectory();
    multipartFiles.stream().forEach(multipartFile -> {
        upload(multipartFile, directory);
    });
    return "上传成功";
}

private List<MultipartFile> getFormMultipartFile(HttpServletRequest request) {
    //将当前上下文初始化给CommonsMutipartResolver多部分解析器)
    MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
    MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
    //检查form中是否有enctype="multipart/form-data"
    if (resolver.isMultipart(request)) {
        //键名是form表单中上传文件控件的name值
        return multipartRequest.getFiles("files");
    }
    return null;
}
测试代码就不再重复了,和上面的html代码一致,将提交路径更改一下就行了。
  • 总结:需要注意的点是使用CommonsMultipartResolver解析器的时候,我们需要关闭Spring Boot上传文件配置,当然也可以通过其他途径去关闭Spring Boot的StandardServletMultipartResolver组件,比如在项目的启动器中去排除等。个人建议使用StandardServletMultipartResolver,简单、方便,无需添加其它依赖,你们觉得呢?

如有不到之处,欢迎各位留言指正,不慎感激。
更多文章:
点击跳转CSDN博客
点击跳转简书博客
公众号:代码小搬运
扫码关注代码小搬运公众号

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值