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

简介: 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>


对应的页面效果如下:

image.png



一.二 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, 选择文件,进行上传


image.png


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

image.png

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


image.png


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


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

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

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


重新上传文件:

image.png


放置在本项目的 target 目录下

image.png



当执行 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;
    }
}


重新上传文件


image.png

image.png

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


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

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


我们上传这个文件, 9.5M


image.png


image.png


后端控制台报错

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

image.png


二.四.二 重新上传测试

重启项目,再次上传

image.png



上传文件成功.

image.png



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

/**
     * 上传文件时,同时传入参数的信息.
     * @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 方式进行测试


image.png


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


发送请求:


查看控制台打印信息:


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


相关文章
|
3月前
|
XML 前端开发 Java
基于SpringBoot 3.3实现任意文件在线预览功能的技术分享
【8月更文挑战第30天】在当今的数字化办公环境中,文件在线预览已成为提升工作效率、优化用户体验的重要功能之一。无论是文档、图片、PDF还是代码文件,用户都期望能够直接在浏览器中快速查看而无需下载。本文将围绕如何在Spring Boot 3.3框架下实现这一功能,分享一系列技术干货,助力开发者高效构建文件预览服务。
336 2
|
12天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
48 1
SpringBoot获取项目文件的绝对路径和相对路径
|
6天前
|
网络协议 Java
springboot配置hosts文件
springboot配置hosts文件
33 11
|
22天前
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
springboot + minio + kkfile实现文件预览
|
12天前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
50 8
|
11天前
|
存储 前端开发 JavaScript
|
11天前
|
存储 Java API
|
1月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
13天前
|
Java
SpringBoot获取文件将要上传的IP地址
SpringBoot获取文件将要上传的IP地址
28 0
|
1月前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
65 2