首页 > 其他分享 >SpringBoot2.x系列教程18--Web开发04之实现文件上传

SpringBoot2.x系列教程18--Web开发04之实现文件上传

时间:2022-12-23 15:02:48浏览次数:37  
标签:Web String 04 文件 -- upload org import 上传


SpringBoot系列教程18--Web开发04之实现文件上传

作者:一一哥

一. 概述

文件上传是开发中比较常见的功能之一.但是SpringBoot并没有提供特别的文件上传技术,而是依赖于SpringMVC的文件上传技术.在SpringBoot中集成了SpringMVC的很多常用功能,也包含了文件上传部分,实现起来没有太多的区别.

本章节我们就讲解如何在Spring Boot中实现文件文件上传.

1. MultipartFile简介

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

MultipartFile是个接口,它的实现类有​​CommonsMultipartFile​​​和​​StandardMultipartFile​​,这里简单说明:

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

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

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

byte[] getBytes(): 获取文件数据;
String getContentType(): 获取文件MIME类型,如application/pdf、image/pdf等;
InputStream getInputStream(): 获取文件流;
String getOriginalFileName(): 获取上传文件的原名称;
long getSize(): 获取文件的字节大小,单位为byte;
boolean isEmpty(): 是否上传的文件是否为空;
void transferTo(File dest): 将上传的文件保存到目标文件中

2. 注意:

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

二. 使用SpringBoot上传单个文件

1. 在原有项目中创建一个新的module

SpringBoot2.x系列教程18--Web开发04之实现文件上传_html

2. 改造pom.xml文件,添加相关依赖包

<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>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<form enctype="multipart/form-data" method="post" action="/upload">
文件: <input type="file" name="fileUpload"/>
<input type="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=true
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

#文件上传目录(注意Linux和Windows上的目录结构不同)
#uploadFolder=/root/upload/
#特别要注意此位置
uploadFolder=E:/upload/

5. 创建信息提示类Message

创建项目包,在包里创建一个JavaBean,用于对外展示信息。

package com.yyg.boot.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* 采用lombok简化bean
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {

/**
*0表示成功,-1表示失败
*/
int status;

/**
* 向前端返回的内容
*/
String massage;

}

6. 创建文件上传的UploadController类

package com.syc.boot.web;

import com.syc.boot.domain.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.UUID;

/**
* 实现文件上传的控制器
*/
@Controller
public class UploadController {

@Value("${uploadFolder}")
private String fileDir;

@RequestMapping("/picUpload")
public String picUpload(){
//跳转到picUpload.html
return "picUpload";
}

@ResponseBody
@PostMapping("/upload")
public Object upload(MultipartFile fileUpload){
//获取文件名
String fileName = fileUpload.getOriginalFilename();
//获取文件后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//重新生成文件名
fileName = UUID.randomUUID()+suffixName;
//指定本地文件夹存储图片
try {

System.out.println("------->>"+fileDir);
File dir = new File(fileDir);
if (!dir.exists()) {
dir.mkdirs();
}
File upload_file = new File(fileDir + fileName);
fileUpload.transferTo(upload_file);
return new Message(0,"success to upload");
} catch (Exception e) {
e.printStackTrace();
return new Message(-1,"fail to upload");
}
}
}

7. 应用程序入口类

package com.syc.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class UploadWebApplication {

public static void main(String[] args) {
SpringApplication.run(UploadWebApplication.class, args);
}
}

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

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

SpringBoot2.x系列教程18--Web开发04之实现文件上传_spring_02

9. 整个工程目录结构

SpringBoot2.x系列教程18--Web开发04之实现文件上传_文件上传_03

三. 使用SpringBoot上传多个文件

我们有时候需要同时上传多个文件,那么如何实现呢?

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

我们首先创建一个多文件上传的html页面multiUpload.html。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>多文件上传</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/>
</head>

<body>
<div>
<div>
<div>
<h3>多个文件上传</h3>
</div>
<div>
<form method="post" enctype="multipart/form-data" th:action="@{/uploadMultifile}">
<div>
<label for="attachment1">文件上传: </label>
<div>
<input type="file" name="attachment" id="attachment1" placeholder="请选择邮件附件"/>
</div>
</div>
<div>
<label for="attachment2">文件上传: </label>
<div class="col-sm-5">
<input type="file" name="attachment" id="attachment2" placeholder="请选择邮件附件"/>
</div>
</div>
<div>
<label for="attachment3">文件上传: </label>
<div>
<input type="file" name="attachment" id="attachment3" placeholder="请选择邮件附件"/>
</div>
</div>

<div>
<div>
<button type="submit">上 传</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>

</html>

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

要实现多文件上传,可以在上面的controller中添加一个新的接口方法.

@RequestMapping("/multiUpload")
public String multiUpload(){
//跳转到multiUpload.html
return "multiUpload";
}

@RequestMapping(value = "/uploadMultifile", method = RequestMethod.POST)
@ResponseBody
public Object uploadMultiFile(@RequestParam("attachment") MultipartFile[] fileUpload) {

try {
for (int i=0;i<fileUpload.length;i++){
//获取文件名
String fileName = fileUpload[i].getOriginalFilename();
//指定本地文件夹存储图片
File dir = new File(fileDir);
if (!dir.exists()) {
dir.mkdirs();
}
if (fileUpload[i]!=null){
File upload_file = new File(fileDir + fileName);
fileUpload[i].transferTo(upload_file);
}
}
return new Message(0,"success to upload");
} catch (Exception e) {
e.printStackTrace();
return new Message(-1,"fail to upload");
}

}

3. 多文件上传验证

SpringBoot2.x系列教程18--Web开发04之实现文件上传_spring_04

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

四. 总结下文件上传的要点:

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

标签:Web,String,04,文件,--,upload,org,import,上传
From: https://blog.51cto.com/u_7044146/5965742

相关文章

  • SpringBoot2.x系列教程17--Web开发03之支持jsp
    SpringBoot系列教程17--Web开发03之支持jsp作者:一一哥咱们都知道,在SpringMVC中是支持JSP的,但是在SpringBoot中,其实不建议使用JSP。因为在使用嵌入式servlet容器时,有一些......
  • 教你用JavaScript实现计数器
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个计数器。点击按钮数字改变,点击重置数字归0。通过实战我们将学......
  • 教你用JavaScript实现计数器
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个计数器。点击按钮数字改变,点击重置数字归0。通过实战我们将学会fo......
  • 数字化工厂对比传统工厂有哪些好处
    在工业4.0的背景下,向数字化工厂转型是传统工厂转型的趋势。很多企业领导还在疑惑,数字化工厂比传统工厂有哪些优势呢?针对传统工厂,数字化工厂将设备联网,数据自动反馈,更好的去......
  • SpringBoot2.x系列教程14--SpringBoot特性之SpringApplication详解
    SpringBoot系列教程14--SpringBoot特性之SpringApplication详解作者:一一哥从本章节开始,我们将深入详细的介绍SpringBoot,通过阅读本节你可以了解到需要使用和定制的核心特性......
  • SpringBoot2.x系列教程13--SpringBoot开发利刃之热部署原理及最优实践
    SpringBoot系列教程13--SpringBoot开发利刃之热部署原理及最优实践作者:一一哥一.SpringBoot的热部署1.概述SpringBoot为开发者提供了一个名为spring-boot-devtools的额外工......
  • SMBus 协议
     SMBus是I2C协议的一个子集SMBus:SystemManagementBus,系统管理总线。SMBus最初的目的是为智能电池、充电电池、其他微控制器之间的通信链路而定义的。SMBus也......
  • SpringBoot2.x系列教程16--Web开发02之静态资源配置
    SpringBoot系列教程16--Web开发02之静态资源配置作者:一一哥在上一章节中,我们讲解了如何在SpringBoot项目中使用Thymeleaf模板,接下来我们在上一节的案例demo05中讲解如何使......
  • SpringBoot2.x系列教程12--SpringBoot自动配置原理探析
    SpringBoot系列教程12--SpringBoot自动配置原理探析作者:一一哥一.SpringBoot自动配置概述1.概述在Spring4.x之后,提供了一个按条件配置Bean的功能,并且结合“习惯优于配置”......
  • 神器,音乐加密解锁
    支持常见的音乐软件加密格式解锁,一键拖拽 UnlockMusic记得F..Q ......