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


相关文章
|
2月前
|
存储 前端开发 Java
SpringBoot使用云端资源url下载文件的接口写法
在Spring Boot中实现从云端资源URL下载文件的功能可通过定义REST接口完成。示例代码展示了一个`FileDownloadController`,它包含使用`@GetMapping`注解的方法`downloadFile`,此方法接收URL参数,利用`RestTemplate`下载文件,并将文件字节数组封装为`ByteArrayResource`返回给客户端。此外,通过设置HTTP响应头,确保文件以附件形式下载。这种方法适用于从AWS S3或Google Cloud Storage等云服务下载文件。
205 7
|
1天前
|
XML 前端开发 Java
基于SpringBoot 3.3实现任意文件在线预览功能的技术分享
【8月更文挑战第30天】在当今的数字化办公环境中,文件在线预览已成为提升工作效率、优化用户体验的重要功能之一。无论是文档、图片、PDF还是代码文件,用户都期望能够直接在浏览器中快速查看而无需下载。本文将围绕如何在Spring Boot 3.3框架下实现这一功能,分享一系列技术干货,助力开发者高效构建文件预览服务。
17 2
|
16天前
|
JavaScript 前端开发 easyexcel
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
本文展示了基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的完整过程,包括后端使用EasyExcel生成Excel文件流,前端通过Blob对象接收并触发下载的操作步骤和代码示例。
89 0
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
|
7天前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
|
12天前
|
存储 Java API
SpringBoot + MinIO 实现文件切片极速上传技术
【8月更文挑战第19天】在现代互联网应用中,文件上传是一个常见且重要的功能。然而,随着文件体积的增大,传统的文件上传方式往往面临效率低下、耗时过长等问题。为了提升大文件上传的速度和效率,我们可以采用文件切片上传技术,并结合SpringBoot和MinIO来实现这一功能。
70 0
|
18天前
|
Java
Java SpringBoot FTP 上传下载文件
Java SpringBoot FTP 上传下载文件
59 0
|
18天前
|
JavaScript Java
SpringBoot 下载文件
SpringBoot 下载文件
23 0
|
18天前
|
JavaScript Java Spring
SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名
SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名
66 0
|
30天前
|
存储 运维 Java
SpringBoot使用log4j2将日志记录到文件及自定义数据库
通过上述步骤,你可以在Spring Boot应用中利用Log4j2将日志输出到文件和数据库中。这不仅促进了良好的日志管理实践,也为应用的监控和故障排查提供了强大的工具。强调一点,配置文件和代码的具体实现可能需要根据应用的实际需求和运行环境进行调优和修改,始终记住测试配置以确保一切运行正常。
169 0
|
2月前
|
前端开发 Java 网络架构
SpringBoot使用接口下载图片的写法
在Spring Boot中实现图片下载功能涉及定义一个REST接口来发送图片文件。首先,创建`ImageController`类,并在其中定义`downloadImage`方法,该方法使用`@GetMapping`注解来处理HTTP GET请求。方法内部,通过`Files.readAllBytes`读取图片文件到字节数组,再将该数组封装成`ByteArrayResource`。接着,设置`HttpHeaders`以指定文件名为`image.jpg`并配置为附件下载。
下一篇
云函数