欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot上传文件

程序员文章站 2022-05-04 09:55:41
...

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页面的效果如下所示:
Spring Boot上传文件

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”进行文件上传,如下图所示:
Spring Boot上传文件
点击“上传”按钮即可,如下图所示:
Spring Boot上传文件
如果要查看上传的文件,有两种方法:
第一种:
复制粘贴上述返回的地址到浏览器中访问即可:
Spring Boot上传文件
第二种:
Spring Boot上传文件

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 多文件上传

下次遇到再写。

相关标签: Spring&Spring Boot