SpringBoot2.x系列教程23--SpringBoot中实现文件上传

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前言文件上传是开发时比较常见的功能之一,但是SpringBoot并没有提供额外的文件上传技术,还是依赖于SpringMVC的文件上传技术。因为在SpringBoot中集成了SpringMVC的很多常用功能,所以SpringBoot的Web模块中也包含了文件上传部分,其实实现起来没有太多的难度。本章节 壹哥 就给大家讲一下在Spring Boot中如何实现单个文件和多个文件的上传功能。一. 概述1. MultipartFile简介在SpringMVC时代,就提供了MultipartFile这个封装类,它包含了文件的二进制流和文件相关属性(文件名、大小等),而在Spring Boot中

前言

文件上传是开发时比较常见的功能之一,但是SpringBoot并没有提供额外的文件上传技术,还是依赖于SpringMVC的文件上传技术。因为在SpringBoot中集成了SpringMVC的很多常用功能,所以SpringBoot的Web模块中也包含了文件上传部分,其实实现起来没有太多的难度。

本章节 壹哥 就给大家讲一下在Spring Boot中如何实现单个文件和多个文件的上传功能。

一. 概述

1. MultipartFile简介

在SpringMVC时代,就提供了MultipartFile这个封装类,它包含了文件的二进制流和文件相关属性(文件名、大小等),而在Spring Boot中也是使用此封装类进行文件上传。

MultipartFile是个接口,它的实现类有CommonsMultipartFileStandardMultipartFile,这里我做一下简单说明:

1️⃣. CommonsMultipartFile: 是基于apache fileupload的解析;

2️⃣. StandardMultipartFile: 是基于j2ee自带的文件上传进行解析,也就是使用Servlet3.0提供的javax.servlet.http.Part上传方式。

我们在正常使用MultipartFile时,无需关心底层是以哪种方式进行文件上传处理的,SpringMVC会给我们做相应的转换。

另外我们要注意,如果想要实现文件上传,必须将表单的method设置为post,并将enctype设置为multipart/form-data。只有这样,浏览器才会把用户所选择文件的二进制数据发送给服务器。SpringMVC在文件上传时,会将上传的文件映射为MultipartFile对象,并对MultipartFile对象进行文件的解析和保存。

2. MultipartFile内的API方法

byte[] getBytes(): 获取文件数据;

String getContentType(): 获取文件MIME类型,如application/pdf、image/pdf等;

InputStream getInputStream(): 获取文件流;

String getOriginalFileName(): 获取上传文件的原名称;

long getSize(): 获取文件的字节大小,单位为byte;

boolean isEmpty(): 是否上传的文件是否为空;

void transferTo(File dest): 将上传的文件保存到目标文件中

二. SpringBoot中实现单文件上传

1. 创建一个新模块module

我们继续在之前的项目中,创建一个新的项目模块,具体创建过程请参考之前的文章,创建过程略过。

2. 添加相关依赖包

这里我们要添加一些重要依赖包,主要是web依赖和thymeleaf模板依赖。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--为了解决thymeleaf模板中,对html标签要求太严格的问题!--><dependency><groupId>net.sourceforge.nekohtml</groupId><artifactId>nekohtml</artifactId><version>1.9.22</version></dependency><!--简化bean的代码--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

3. 编写文件上传页面picUpload.html

我们在resource/templates目录下,创建一个文件上传页面,用于提交文件上传表单。

<!DOCTYPE HTML><html><head><title>pictureUploading</title><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"></head><body><formenctype="multipart/form-data"method="post"action="/upload">    文件: <inputtype="file"name="fileUpload"/><inputtype="submit"value="上传"/></form></body></html>

4. 配置application.properties

接着在resources目录下,创建application.properties配置文件,并设置相关配置属性,这里主要是对文件上传路径做了配置。

# Template mode to be applied to templates. See also StandardTemplateModeHandlers.spring.thymeleaf.mode=LEGACYHTML5
spring.servlet.multipart.enabled=truespring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
#文件上传目录(注意Linux和Windows上的目录结构不同)#uploadFolder=/root/upload/#特别要注意此位置uploadFolder=E:/upload/

5. 创建信息提示类Message

创建一个实体类,用于对外展示文件上传后的状态信息。

packagecom.yyg.boot.domain;
importlombok.AllArgsConstructor;
importlombok.Data;
importlombok.NoArgsConstructor;
/*** 采用lombok简化bean*/@Data@NoArgsConstructor@AllArgsConstructorpublicclassMessage {
/***0表示成功,-1表示失败*/intstatus;
/*** 向前端返回的内容*/Stringmassage;
}

6. 创建文件上传的UploadController类

然后我们创建一个Controller,在这里编写文件上传接口,文件上传要使用post请求方式。

packagecom.syc.boot.web;
importcom.syc.boot.domain.Message;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.PostMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.ResponseBody;
importorg.springframework.web.multipart.MultipartFile;
importjava.io.File;
importjava.util.UUID;
/*** 实现文件上传的控制器*/@ControllerpublicclassUploadController {
@Value("${uploadFolder}")
privateStringfileDir;
@RequestMapping("/picUpload")
publicStringpicUpload(){
//跳转到picUpload.htmlreturn"picUpload";
    }
@ResponseBody@PostMapping("/upload")
publicObjectupload(MultipartFilefileUpload){
//获取文件名StringfileName=fileUpload.getOriginalFilename();
//获取文件后缀名StringsuffixName=fileName.substring(fileName.lastIndexOf("."));
//重新生成文件名fileName=UUID.randomUUID()+suffixName;
//指定本地文件夹存储图片try {
System.out.println("------->>"+fileDir);
Filedir=newFile(fileDir);
if (!dir.exists()) {
dir.mkdirs();
            }
Fileupload_file=newFile(fileDir+fileName);
fileUpload.transferTo(upload_file);
returnnewMessage(0,"success to upload");
        } catch (Exceptione) {
e.printStackTrace();
returnnewMessage(-1,"fail to upload");
        }
    }
}

7. 应用程序入口类

最后编写项目入口类。

packagecom.syc.boot;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublicclassUploadWebApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(UploadWebApplication.class, args);
    }
}

8. 运行程序,实现文件上传

接下来我们启动程序,访问文件上传界面,选择文件进行上传,如果可以看到如下效果,则说明文件上传成功。

我这里是把文件上传到了本机的E盘目录下,真正开发时一般是上传到Linux服务器的某个目录下,过程都一样的,主要是存储位置的不同。当然现在也有很多项目是采用云存储,关于云存储我会在下一章节中带大家实现。

9. 项目结构

最后我们看一下项目的代码结构,各位可以参考创建。

三. SpringBoot中实现多文件上传

上面我们实现了单个文件的上传,但有时我们也需要同时上传多个文件,那这该如何实现呢?

1. 创建多文件上传的html页面

我们在上面的项目基础之上,创建多文件上传的html页面,页面名称是multiUpload.html。

<!DOCTYPE html><htmlxmlns:th="http://www.thymeleaf.org"><head><title>多文件上传</title><metacharset="utf-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content="width=device-width,initial-scale=1,user-scalable=no"/></head><body><div><div><div><h3>多个文件上传</h3></div><div><formmethod="post"enctype="multipart/form-data"th:action="@{/uploadMultifile}"><div><labelfor="attachment1">文件上传: </label><div><inputtype="file"name="attachment"id="attachment1"placeholder="请选择邮件附件"/></div></div><div><labelfor="attachment2">文件上传: </label><divclass="col-sm-5"><inputtype="file"name="attachment"id="attachment2"placeholder="请选择邮件附件"/></div></div><div><labelfor="attachment3">文件上传: </label><div><inputtype="file"name="attachment"id="attachment3"placeholder="请选择邮件附件"/></div></div><div><div><buttontype="submit">&nbsp;</button></div></div></form></div></div></div></body></html>

2. 创建一个多文件上传的方法

我们直接在上面的Controller中添加一个新的多文件上传接口。

@RequestMapping("/multiUpload")
publicStringmultiUpload(){
//跳转到multiUpload.htmlreturn"multiUpload";
    }
@RequestMapping(value="/uploadMultifile", method=RequestMethod.POST)
@ResponseBodypublicObjectuploadMultiFile(@RequestParam("attachment") MultipartFile[] fileUpload) {
try {
for (inti=0;i<fileUpload.length;i++){
//获取文件名StringfileName=fileUpload[i].getOriginalFilename();
//指定本地文件夹存储图片Filedir=newFile(fileDir);
if (!dir.exists()) {
dir.mkdirs();
                }
if (fileUpload[i]!=null){
Fileupload_file=newFile(fileDir+fileName);
fileUpload[i].transferTo(upload_file);
                }
            }
returnnewMessage(0,"success to upload");
        } catch (Exceptione) {
e.printStackTrace();
returnnewMessage(-1,"fail to upload");
        }
    }

3. 多文件上传验证

重启项目后,我们测试一下这个多文件上传功能。

正常情况下,我们就看到了多文件上传的测试结果,我这里一次性上传了3张图片。

最终我们就实现了在Spring Boot中的多文件上传功能。

结语

这样我们就实现了在SpringBoot环境中的文件上传功能,最后 壹哥 再把文件上传时的重点给大家总结强调一下。

  • 1️⃣. 表单method要设置为post,并将enctype设置为 multipart/form-data
  • 2️⃣. 文件映射为MultipartFile对象进行解析;
  • 3️⃣. 上传文件大小spring.http.multipart.max-file-size 限制。

相关文章
|
2月前
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
237 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
2月前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
237 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
2月前
|
Java API Apache
Springboot+shiro,完整教程,带你学会shiro
这篇文章提供了一个完整的Apache Shiro与Spring Boot结合使用的教程,包括Shiro的配置、使用以及在非Web和Web环境中进行身份验证和授权的示例。
72 2
Springboot+shiro,完整教程,带你学会shiro
|
2月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
375 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
2月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
117 1
springboot的缓存和redis缓存,入门级别教程
|
2月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
170 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
2月前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
97 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
162 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
104 62
|
29天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
53 2