SpringBoot文件上传下载

简介: SpringBoot文件上传下载


@[Toc]



一、SpringMVC上传文件

Spring MVC 文件上传提供了良好的支持 ,而在 Spring Boot 更为简单地配置文件上传
所需的内容。

SpringMVC 中对文件上传做了封装,可以实现更简单地文件上传。从 Spring3.1 开始,对于文件上传,提供了两个处理器:

  • CommonsMultipartResolver
  • StandardServletMultipartResolver

第一个处理器兼容性较好,可以兼容 Servlet3.0 之前的版本,但是它依赖了 commons-fileupload 这个第三方工具,所以如果使用这个,一定要添加 commons-fileupload 依赖。

第二个处理器兼容性较差,它适用于 Servlet3.0 之后的版本,它不依赖第三方工具,使用它,可以直接做文件上传。



二、SpringBoot文件上传

我们这里采用StandardServletMultipartResolver处理器来上传文件:


1、添加依赖

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>


2、配置

#⽀持的最⼤⽂件
spring.servlet.multipart.max-file-size=100MB
#⽂件请求最⼤限制
spring.servlet.multipart.max-request-size=100MB

除了这两个配置之外常用的配置:

  • spring.servlet.multipart.enabled=true,是否⽀持 multipart 上传⽂件
  • spring.servlet.multipart.file-size-threshold=0,⽀持⽂件写⼊磁盘
  • spring.servlet.multipart.location=,上传⽂件的临时⽬录
  • spring.servlet.multipart.max-file-size=10Mb,最⼤⽀持⽂件⼤⼩
  • spring.servlet.multipart.max-request-sizee=10Mb,最⼤⽀持请求⼤⼩
  • spring.servlet.multipart.resolve-lazily=false,是否⽀持 multipart 上传⽂件时懒加载


3、上传单个文件


可以用SpringBoot默认的thymeleaf模板,这里就只写后端的接口。

同样地,偷了下懒,异常处理和结果封装都没有写……

/**
     * 上传单个文件
     *
     * @param file
     * @param redirectAttributes
     * @return
     */
    @PostMapping("/upload")
    public String singleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
        //文件非空判断
        if (file.isEmpty()) {
            redirectAttributes.addFlashAttribute("message", "请选择一个文件");
            return "文件为空,请重新上传";
        }
        try {
            // Get the file and save it somewhere
            byte[] bytes = file.getBytes();
            // UPLOADED_FOLDER ⽂件本地存储地址
            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
            //保存文件
            Files.write(path, bytes);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传文件成功!";
    }


用PostMan测试:

在这里插入图片描述

4、上传多个文件

稍作修改,MultipartFile 需要修改为按照数组的⽅式去接收。

 /**
     * 上传多个文件
     *
     * @param files
     * @param redirectAttributes
     * @return
     */
    @PostMapping("/uploadMore")
    public String moreFileUpload(@RequestParam("file") MultipartFile[] files,
                                 RedirectAttributes redirectAttributes) {
        if (files.length == 0) {
            return "文件不能为空,请选择一个文件!";
        }
        for (MultipartFile file : files) {
            try {
                byte[] bytes = file.getBytes();
                Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
                Files.write(path, bytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "所有文件上传成功!";
    }

用PostMan测试:

在这里插入图片描述


5、文件下载

 /**
     * 下载文件
     * @param response
     * @param fileName
     * @return
     */
    @GetMapping("/downloadFile")
    public String downloadFile(HttpServletResponse response, @RequestParam("fileName") String fileName) {
        File file = new File(UPLOADED_FOLDER+fileName);
        if (!file.exists()) {
            return "文件不存在!";
        }

        response.reset();
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);

        try {
            InputStream inStream = new FileInputStream(fileName);
            OutputStream os = response.getOutputStream();

            byte[] buff = new byte[1024];
            int len = -1;
            while ((len = inStream.read(buff)) > 0) {
                os.write(buff, 0, len);
            }
            os.flush();
            os.close();

            inStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "下载成功!";
    }

由于接口是get请求方式,所以直接用浏览器访问 localhost:8080/downloadFile?fileName=001.jpg:

在这里插入图片描述




本文为学习笔记类博客,学习资料来源见参考!
参考: 【1】:《精通 Spring Boot 42 讲》 【2】:[SpringBoot | 第十七章:web应用开发之文件上传 ](https://blog.lqdev.cn/2018/08/07/springboot/chapter-seventeen/) 【3】:《深入浅出SpringBoot2.X》 【4】:[SpringMVC 教程--8. 文件上传](http://springmvc.javaboy.org/2019/1110/fileupload) 【5】:[SpringBoot 文件上传、下载、设置大小](https://www.cnblogs.com/chevin/p/9260842.html) 【6】:[Spring Boot 上传文件](https://www.itcto.cn/springboot/spring-boot-file/)
目录
相关文章
|
3月前
|
XML 前端开发 Java
基于SpringBoot 3.3实现任意文件在线预览功能的技术分享
【8月更文挑战第30天】在当今的数字化办公环境中,文件在线预览已成为提升工作效率、优化用户体验的重要功能之一。无论是文档、图片、PDF还是代码文件,用户都期望能够直接在浏览器中快速查看而无需下载。本文将围绕如何在Spring Boot 3.3框架下实现这一功能,分享一系列技术干货,助力开发者高效构建文件预览服务。
339 2
|
13天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
51 1
SpringBoot获取项目文件的绝对路径和相对路径
|
7天前
|
网络协议 Java
springboot配置hosts文件
springboot配置hosts文件
34 11
|
24天前
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
springboot + minio + kkfile实现文件预览
|
13天前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
53 8
|
13天前
|
存储 前端开发 JavaScript
|
13天前
|
存储 Java API
|
1月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
14天前
|
Java
SpringBoot获取文件将要上传的IP地址
SpringBoot获取文件将要上传的IP地址
29 0
|
1月前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
65 2