Spring Boot上传文件

1 概述

Java中的文件上传一共涉及两个组件,一个是CommonsMultipartResolver,另一个是StandardServletMultipartResolver,其中CommonsMultipartResolver使用commons-fileupload来处理multipart请求,而StandardServletMultipartResolver则是基于Servlet 3.0来处理multipart请求的,因此若使用StandardServletMultipartResolver,则不需要添加额外的jar包。Tomcat 7.0开始就支持Servlet 3.0了,而Spring Boot 2.0.4内嵌的是Tomcat 8.5.32,因此可以直接使用StandardServletMultipartResolver
而在Spring Boot提供的文件上传自动化配置类MultipartAutoConfiguration中,默认也是采用StandardServletMultipartResolver,根据其源码(自己阅读)可以看出,如果开发者没有提供MultipartResolver,那么默认采用的MultipartResolver就是StandardServletMultipartResolver。因此,在Spring Boot中上传文件可以做到零配置。下面来看具体的上传过程

2 单文件上传

2.1 创建项目,并添加依赖

首先创建一个Spring Boot项目,并添加spring-boot-starter-web依赖。这是应用Spring Boot构建web应用程序所必须的依赖,不需要添加文件上传相关的依赖,这确实做到了零配置。

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

2.2 编写html上传页面

在resources目录下的static目录中创建一个upload.html文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFile" value="请选择文件">
    <input type="submit" value="上传">
</form>
</body>
</html>

其中,action的值要和后端Cotroller的请求url相同method必须为post,enctype的值如上所示。编写的html页面的效果如下所示:
在这里插入图片描述

2.3 后端Controller

package com.example.demo;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@RestController
public class FileUploadController {
    
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
    @PostMapping("/upload")
    public String upload(MultipartFile uploadFile, HttpServletRequest req) {
    
    
        String realPath = req.getSession().getServletContext().getRealPath("/uploadFile/");
        String format = sdf.format(new Date());
        File folder = new File(realPath + format);
        if (!folder.isDirectory()) {
    
    
            folder.mkdirs();
        }
        String oldName = uploadFile.getOriginalFilename();
        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."), oldName.length());
        try {
    
    
            uploadFile.transferTo(new File(folder, newName));
            String filePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/uploadFile/" + format + newName;
            return "上传成功:" + filePath;
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return "上传失败";
    }
}

2.4 测试

最后在浏览器中进行测试。启动项目,在浏览器中输入“http://localhost:8080/upload.html”进行文件上传,如下图所示:
在这里插入图片描述
点击“上传”按钮即可,如下图所示:
在这里插入图片描述
如果要查看上传的文件,有两种方法:
第一种:
复制粘贴上述返回的地址到浏览器中访问即可:
在这里插入图片描述
第二种:
在这里插入图片描述

2.5 注意事项

1、html上传页面的action值必须要和后端Controller接口地址相同。
2、<input type="file" name="uploadFile" value="请选择文件">中name的值(uploadFile)必须要和后端MultipartFile的值相同。
3、如果开发者需要对上传文件的细节进行配置,也是可以的,代码如下:

spring.servlet.multipart.enable=true
spring.servlet.multipart.file-size-threshold=0
spring.servlet.multipart.location=D://temp
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.resolve-lazily=false

第1行表示是否开启文件上传支持,默认为true
第2行表示文件写入磁盘的阈值,默认为0
第3行表示上传文件的临时保存位置
第4行表示上传的单个文件的最大大小,默认1MB
第5行表示多文件上传时文件的总大小,默认10MB
第6行表示文件是否延迟解析,默认为false

3 多文件上传

下次遇到再写。

猜你喜欢

转载自blog.csdn.net/weixin_44072535/article/details/110135340