0

0

Springboot文件上传功能怎么实现

王林

王林

发布时间:2023-05-29 15:32:51

|

1196人浏览过

|

来源于亿速云

转载

1.新建文件上传页面

在static目录中新建upload-test.html,上传页面代码如下所示:




    
    springboot文件上传测试


其中后端处理文件上传的请求地址为/uploadFile,请求方法为POST。在文件上传时需要设置form表单的enctype属性为“multipart/form-data”。
效果图如下:

Springboot文件上传功能怎么实现

2.新建文件上传处理Controller类

在controller包下新建UploadController类并编写实际的文件上传逻辑代码,如下所示:

package ltd.newbee.mall.controller;

import ltd.newbee.mall.util.PageResult;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

@Controller
public class UploadController {
    //文件保存路径为在D盘下的upload文件夹,可以按照自己的习惯修改
    private final static String FILE_UPLOAD_PATH = "D:\\upload\\";
    @RequestMapping(value = "/uploadFile",method = RequestMethod.POST)
    @ResponseBody
    public String uploadFile(@RequestParam("file") MultipartFile file){
        if (file.isEmpty()){
            return "文件上传失败";
        }
        String fileName = file.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //生成文件名称通用方法
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        Random r = new Random();
        StringBuilder tempName = new StringBuilder();
        tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);
        String newFileName = tempName.toString();
        try {
            //保存文件
            byte[] bytes = file.getBytes();
            Path path = Paths.get(FILE_UPLOAD_PATH+newFileName);
            Files.write(path,bytes);
        }catch (IOException e){
            e.printStackTrace();
        }
        return "上传成功";
    }
}

由于Spring Boot已经自动配置了StandardServletMultipartResolver类来处理文件上传请求,因此能够直接在控制器方法中使用MultipartFile读取文件信息。 @RequestParam中文件名称属性需要与前端页面中input文件输入框设置的name属性一致。如果文件为空则返回上传失败,如果不为空则根据日期生成一个新的文件名,读取文件流程并写入指定的路径中,最后返回上传成功的提示信息。
需要注意的是文件上传路径的设置。在上述代码中设置的文件保存路径为D:\upload\,即在D盘下的upload文件夹。如果项目部署在Linux系统中的话,写法与此不同。比如想要把文件上传到/opt/newbee/upload目录下,就需要把路径设置的代码改为private final static String FILE_UPLOAD_PATH = “/opt/newbee/upload/”。这一点需要注意,两种系统的写法存在一些差异。如果文件存储目录还没有创建的话,首先需要创建该目录,然后启动项目进行文件上传测试。

3.文件上传功能测试

在编码完成后,启动Spring Boot项目。在启动成功后,打开浏览器并输入测试页面地址:

http://localhost:8080/upload-test.html

打开后选择上传的文件,然后上传,显示成功。

Springboot文件上传功能怎么实现

检查本机upload目录下是否有改文件(注意这里需要在对应的位置建立好upload文件夹)

Springboot文件上传功能怎么实现

另外,在Spring Boot项目中支持单个文件的最大值默认为1MB,支持单个请求最大值默认10 MB。上传的文件大小超过了默认值,比如选择了一个大小为1.2MB或11MB的文件请求,将导致出错。

4.文件上传路径回显

Spring Boot项目与普通Spring项目的目录结构不同,并没有webapp目录,因此无法与普通的Java Web项目一样,上传文件到webapp目录中并直接根据目录进行访问。Spring Boot项目中通常使用自定义静态资源映射目录,以此来实现文件上传整个流程的闭环。比如在前文文件上传案例中,在文件上传到upload目录后,会增加一个自定义静态资源映射配置,使得在upload下的静态资源可以通过该映射地址被访问到。
新建config包并在config包中新增SpringBootWebMvcConfigurer类,实现代码如下所示:

package ltd.newbee.mall.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SpringBootWebMvcConfigurer implements WebMvcConfigurer {
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler("/upload/**").addResourceLocations("file:D:\\upload\\");
    }

}

通过以上代码配置,所有以“/upload/”开头的静态资源在请求时都会映射到D盘的upload目录下。路径的设置与前文中上传文件的设置目录类似,不同系统的文件路径的写法不同(比如Linux和Windows)。同时需要注意在设置静态资源映射路径时,路径前需要添加“file:”前缀。
最后修改一下在文件上传时的返回信息,把路径拼装好并返回到页面上,以便于功能测试,UploadController代码的修改如下所示:

        return "上传成功,地址为:/upload/"+newFileName;

最后启动项目进行测试

Springboot文件上传功能怎么实现

检查对应目录下是否有文件

I-Shop购物系统
I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

下载

Springboot文件上传功能怎么实现

上传成功完成。

5.多文件上传功能实现

首先,在static目录中新建upload-same-file-name.html,页面代码如下所示:




    
    多文件上传测试(文件名相同)












多文件上传页面与单文件上传页面类似,不同点是新增了4个文件输入框,文件输入框的name属性统一命名为files,文件名完全一致。后端处理文件上传的请求地址为/uploadFilesBySameName,请求方法为POST。
在UploadController类中新增uploadFilesBySameName()方法,用于处理在文件名相同时的多文件上传问题,新增代码如下所示:

    @RequestMapping(value = "/uploadFileBySameName",method = RequestMethod.POST)
    @ResponseBody
    public String uploadFileBySameName(@RequestPart MultipartFile[] files){
        if (files == null|| files.length==0){
            return "参数错误";
        }
        if (files.length>5){
            return "文件最多上传5个";
        }
        String uploadResult = "上传成功,地址为:
"; for (MultipartFile file:files){ String fileName = file.getOriginalFilename(); if (StringUtils.isEmpty(fileName)){ //表示无文件信息,跳出当前循环 continue; } String suffixName = fileName.substring(fileName.lastIndexOf(".")); //生成文件名称的通用方法 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); Random r = new Random(); StringBuilder tempName = new StringBuilder(); tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName); String newFileName = tempName.toString(); try { //保存文件 byte[] bytes = file.getBytes(); Path path = Paths.get(FILE_UPLOAD_PATH+newFileName); Files.write(path,bytes); uploadResult += "/upload/" + newFileName + "
"; }catch (IOException e){ e.printStackTrace(); } } return uploadResult; }

与单文件在上传时的uploadFile()方法相比,多文件上传有两处改动。
第一,文件参数在接收时的代码改动。在多文件上传并接收参数时使用的是@RequestPart注解,且接收的文件参数是一个数组MultipartFile。而单文件在上传时使用的是@RequestParam注解,接收的文件是单个对象。
第二,文件在保存时增加循环逻辑。多文件保存的处理方式与单文件在上传时比较类似,只是增加了循环逻辑,对接收的MultipartFile数组中每一个文件进行存储操作,最后拼接文件的地址信息并返回。
另外一个需要注意的知识点,多文件上传在接收参数时,参数名称files需要完全对应input框中的name属性。比如本次演示,在upload-same-file-name.html文件中所有文件输入框的name属性都是files;在后端处理时,uploadFilesBySameName()方法的参数名称也定义为files,两个名称是对应的。如果所有文件输入框的name属性都改为uploadFiles,那么uploadFilesBySameName()方法的参数名称也需要改为uploadFiles,否则接收的文件对象数组为空。
在编码完成后,启动Spring Boot项目。在在启动成功后打开浏览器并输入多图上传的测试页面地址:

http://localhost:8080/upload-same-file-name.html

实际效果:

Springboot文件上传功能怎么实现

Springboot文件上传功能怎么实现

6.文件名不同时的多文件上传处理

首先,在static目录中新建upload-different-file-name.html,页面代码如下所示:




    
    多文件上传测试(文件名不同)












然后,在UploadController类中新增uploadFilesByDifferentName()方法,用于处理文件名在不相同时的多文件上传,新增代码如下所示:

    @RequestMapping(value = "/uploadFilesByDifferentName",method = RequestMethod.POST)
    @ResponseBody
    public String uploadFilesByDifferentName(HttpServletRequest httpServletRequest Request){
        List multipartFiles = new ArrayList<>(8);
        //如果不是文件上传请求则不处理
        if (!standardServletMultipartResolver.isMultipart(httpServletRequest)){
            return "请选择文件";
        }
        //将HttpServletRequest 对象转换为MultipartHttpServletRequest对象,并读取文件
        MultipartHttpServletRequest multiRequest =(MultipartHttpServletRequest)httpServletRequest;
        Iterator iter = multiRequest.getFileNames();
        int total=0;
        while (iter.hasNext()){
            if (total>5) {
                return "最多上传5个文件";
            }
            total+=1;
            MultipartFile file = multiRequest.getFile(iter.next());
            multipartFiles.add(file);
        }
        if (CollectionUtils.isEmpty(multipartFiles)) {
            return "请选择文件";
        }
        if (multipartFiles != null && multipartFiles.size()>5){
            return "文件最多上传5个";
        }
        String uploadResult = "上传成功,地址为:
"; for(int i=0;i"; }catch (IOException e){ e.printStackTrace(); } } return uploadResult; }

与文件名相同时的多文件上传的uploadFilesBySameName()方法相比,文件名不同时的改动只有一处,即文件参数在接收时的代码做了改动。在读取文件信息时的逻辑是自行实现的代码逻辑,首先调用isMultipart()方法判断当前请求是否为文件上传请求,如果不是则不进行处理,如果是文件上传请求,则HttpServletReques对象转换为MultipartHttpServletRequest对象,并读取文件数据,在读取完成后再依次进行存储。存储文件的过程与之前的逻辑一致,最后拼接文件的地址信息并返回。
另外,需要判断当前请求是否为文件上传请求时要用到StandardServletMultipart Resolver类isMultipart()方法。前文中提到的StandardServletMultipartResolver类已经自动配置,所以可以直接在UploadController类中使用@Autowired注解注入,代码如下所示:

    @Autowired
    private StandardServletMultipartResolver standardServletMultipartResolver;

测试成功

Springboot文件上传功能怎么实现

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

4

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Redis6入门到精通超详细教程
Redis6入门到精通超详细教程

共47课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号