SpringBoot上传和下载文件(二十七)上

一. SpringBoot 上传和下载前期准备


创建项目,按照 整合 Thymeleaf 的项目结构来.


关于 SpringBoot 如何整合Thymeleaf ,

可以看老蝴蝶以前写的文章: SpringBoot整合Thymeleaf(十三)

一. 一 创建页面 index.html

index.html

<!doctype html>
<!--注意:引入thymeleaf的名称空间-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
    <title>文件上传</title>
    <link rel="StyleSheet" href="webjars/bootstrap/3.4.1/css/bootstrap.css" type="text/css">
</head>
<body class="container">
<p class="h1">上传文件</p>
<form  action="upload" method="post" enctype="multipart/form-data">
    <div class="form-group">
        <div class="custom-file">
            <input type="file" class="custom-file-input" id="file" name="file">
            <label class="file-label" for="file">选择文件</label>
        </div>
    </div>
    <button type="submit" class="btn btn-primary">上传</button>
</form>
<p class="h1">文件下载</p>
<a href="download?fileName=yjl.p12">文件下载 yjl.p12</a>
<script type="text/javascript" src="webjars/jquery/3.5.1/jquery.js"></script>
<script type="text/javascript" src="webjars/bootstrap/3.4.1/js/bootstrap.js"></script>
</body>
</html>


对应的页面效果如下:

SpringBoot上传和下载文件(二十七)上



一.二 Controller

FileController.java

@Controller
public class FileController {
    //跳转到 index.html 页面
    @RequestMapping("/")
    public String index(){
        return "index";
    }
}

二. 上传文件

二.一 request 放置上传文件

采用以前的 request 获取文件:

@PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
        // 获得 classpath 的绝对路径
        String realPath = request.getServletContext().getRealPath("static/files");
        File newFile = new File(realPath);
        // 如果文件夹不存在、则新建
        if (!newFile.exists()){
            newFile.mkdirs();
        }
        // 上传
        file.transferTo(new File(newFile, file.getOriginalFilename()));
        String uploadPath=realPath+File.separator+file.getOriginalFilename();
        return "上传文件成功,地址为:"+uploadPath;
    }

 

页面访问 index, 选择文件,进行上传


SpringBoot上传和下载文件(二十七)上


会上传成功,返回的路径是:

SpringBoot上传和下载文件(二十七)上

可以发现,这是一个临时的文件


SpringBoot上传和下载文件(二十七)上


一般都不放置在临时目录下


二.二 放置在该项目类路径下

修改 realPath 路径值,放置在 classpath 路径下

//String realPath = request.getServletContext().getRealPath("static/files");
  String realPath = ResourceUtils.getURL("classpath:").getPath()+"static/files";


重新上传文件:

SpringBoot上传和下载文件(二十七)上


放置在本项目的 target 目录下

SpringBoot上传和下载文件(二十七)上



当执行 mvn clean ,重启服务器等操作时,上传的文件会被清空.


一般都放置在磁盘上,目录的位置由用户指定.


二.三 上传到指定的目录下

二.三.一 application.yml 配置变量,指定目录

application.yml

server:
  port: 8081
  servlet:
    context-path: /File
# 指定目录
uploadFilePath: D:/upload


放置在 D 盘下的 upload 目录下


二.三.二 通过 @Value 等属性注入并使用上传目录

@Controller
public class FileController {
    @Value("${uploadFilePath:D:}")
    private String uploadFilePath;
    @RequestMapping("/")
    public String index(){
        return "index";
    }
    @PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
        // 获得 classpath 的绝对路径
       //String realPath = request.getServletContext().getRealPath("static/files");
       //String realPath = ResourceUtils.getURL("classpath:").getPath()+"static/files";
        String realPath =uploadFilePath;
        File newFile = new File(realPath);
        // 如果文件夹不存在、则新建
        if (!newFile.exists()){
            newFile.mkdirs();
        }
        // 上传
        file.transferTo(new File(newFile, file.getOriginalFilename()));
        String uploadPath=realPath+File.separator+file.getOriginalFilename();
        return "上传文件成功,地址为:"+uploadPath;
    }
}


重新上传文件


SpringBoot上传和下载文件(二十七)上

SpringBoot上传和下载文件(二十七)上

这样,重启服务器等操作,就不会删除掉以前的上传文件了.


二.四 配置上传的文件大小

我们上传 yjl.p12 只有 2kb , 可以正确的上传


我们上传这个文件, 9.5M


SpringBoot上传和下载文件(二十七)上


SpringBoot上传和下载文件(二十七)上


后端控制台报错

org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.


超过了允许的默认大小,上传失败


二.四.一 配置tomcat 上传大小

spring:
  # 配置thymeleaf的相关信息
  thymeleaf:
    # 开启视图解析
    enabled: true
    #编码格式
    encoding: UTF-8
    #前缀配置
    prefix: classpath:/templates/
    # 后缀配置
    suffix: .html
    #是否使用缓存 开发环境时不设置缓存
    cache: false
    # 格式为 HTML 格式
    mode: HTML5
    # 配置类型
    servlet:
      content-type: text/html
  #配置上传的文件信息
  servlet:
    multipart:
      max-file-size: 100MB   # 服务器端文件大小限制
      max-request-size: 100MB  # 客户端请求文件大小限制


默认的值为: 1m

SpringBoot上传和下载文件(二十七)上


二.四.二 重新上传测试

重启项目,再次上传

SpringBoot上传和下载文件(二十七)上



上传文件成功.

SpringBoot上传和下载文件(二十七)上



二.五 上传文件时传入其它的参数

/**
     * 上传文件时,同时传入参数的信息.
     * @date 2021/11/4 21:12
     * @author zk_yjl
     * @return
     */
    @PostMapping("/uploadParam")
    @ResponseBody
    public String uploadParam(@RequestParam MultipartFile file,@RequestParam String name,
                              @RequestParam Integer age) throws IOException {
        String realPath =uploadFilePath;
        File newFile = new File(realPath);
        System.out.println("传入的name参数值:"+name+",传入的age参数值:"+age);
        // 如果文件夹不存在、则新建
        if (!newFile.exists()){
            newFile.mkdirs();
        }
        // 上传
        file.transferTo(new File(newFile, file.getOriginalFilename()));
        String uploadPath=realPath+"/"+file.getOriginalFilename();
        return "上传文件成功,地址为:"+uploadPath;
    }


通过 @RequestParam 注解进行指定


我们采用 postman 方式进行测试


SpringBoot上传和下载文件(二十七)上


postman 上传文件,可以看: 使用PostMan上传文件


发送请求:


查看控制台打印信息:


传入的name参数值:两个蝴蝶飞,传入的age参数值:26


上一篇:归一化(softmax)、信息熵、交叉熵


下一篇:systemd的运行级别与服务管理命令简介