Spring Boot之文件上传:实现简单易用的文件上传功能

简介: 本篇详细介绍了在Spring Boot应用中实现文件上传功能的步骤。从创建前端页面、编写Controller处理、文件存储与访问、添加路由与页面展示等方面进行了详细讲解,并提供了代码示例。通过学习本文,读者可以轻松了解如何在Spring Boot项目中实现简单易用的文件上传功能,从而在实际应用中更好地满足用户需求。

概述

文件上传是Web应用开发中常见的需求之一,Spring Boot提供了便捷的方式来实现文件上传功能。本篇技术长博文将详细介绍如何在Spring Boot应用中实现文件上传,包括前端页面、Controller处理、文件存储以及安全性考虑,通过代码示例演示了实际操作。
文件上传原理

表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
当表单的enctype="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value
当表单的enctype="multipart/form-data"时,其传输数据形式如下

image.png

1. 创建Spring Boot项目

首先,在IDE中创建一个新的Spring Boot项目,确保已包含Web依赖。

2. 编写前端页面

src/main/resources/templates目录下创建一个HTML页面,用于文件上传。

<!DOCTYPE html>
<html>
<head>
    <title>文件上传示例</title>
</head>
<body>
    <h1>文件上传示例</h1>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" accept=".jpg, .png, .pdf">
        <button type="submit">上传文件</button>
    </form>
</body>
</html>

3. 编写Controller处理文件上传

创建一个Controller类,处理文件上传请求并保存文件。

@Controller
public class FileUploadController {
   

    private static final String UPLOAD_DIR = "uploads/";

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
   
        if (file.isEmpty()) {
   
            return "redirect:/uploadFailure";
        }

        try {
   
            byte[] bytes = file.getBytes();
            Path path = Paths.get(UPLOAD_DIR + file.getOriginalFilename());
            Files.write(path, bytes);
        } catch (IOException e) {
   
            e.printStackTrace();
            return "redirect:/uploadFailure";
        }

        return "redirect:/uploadSuccess";
    }
}

4. 文件存储与访问

src/main/resources目录下创建一个uploads文件夹,用于存储上传的文件。为了访问这些文件,你可以配置Spring Boot的静态资源路径。

spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:uploads/

5. 添加路由与页面展示

创建两个简单的HTML页面,用于展示上传结果。

uploadSuccess.html

<!DOCTYPE html>
<html>
<head>
    <title>上传成功</title>
</head>
<body>
    <h1>上传成功</h1>
    <a href="/upload">返回</a>
</body>
</html>

uploadFailure.html

<!DOCTYPE html>
<html>
<head>
    <title>上传失败</title>
</head>
<body>
    <h1>上传失败</h1>
    <a href="/upload">返回</a>
</body>
</html>

6. 运行与测试

运行Spring Boot应用,访问http://localhost:8081/upload,上传一个文件,然后会根据上传结果跳转到相应的页面。

7.其他

Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
要更改这个默认值需要在配置文件(如application.properties)中加入两个配置

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

上传功能

当表单的enctype="multipart/form-data",可以使用MultipartFile 获取上传的文件数据,再通过transferTo方法将其写入到磁盘中
package com.example.controller;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

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

@RestController
public class FileUploadController {
   

   @PostMapping("/upload")
   public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {
   
       System.out.println(nickname);
       // 获取图片的原始名称
       System.out.println(photo.getOriginalFilename());
       // 取文件类型
       System.out.println(photo.getContentType());

       String path = request.getServletContext().getRealPath("/upload/");
       System.out.println(path);
       saveFile(photo,path);
       return "上传成功";
  }

//
   public void saveFile(MultipartFile photo,String path) throws IOException {
   
//       判断存储的目录是否存在,如果不存在则创建
       File dir = new File(path);
       if(!dir.exists()){
   
//         创建目录
           dir.mkdir();
      }

       File file = new File(path+photo.getOriginalFilename());
       photo.transferTo(file);
  }
}

测试

image.png

总结

本文详细介绍了如何在Spring Boot应用中实现文件上传功能。通过前端页面、Controller处理、文件存储和页面展示等步骤,你可以轻松地在Spring Boot应用中添加文件上传功能。通过学习本文内容,你可以更加深入地理解文件上传的实现原理,从而在实际项目中应用和扩展该功能。

相关文章
|
7月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
706 2
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
1135 0
|
10月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
1048 1
|
12月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
359 32
|
12月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
1545 8
|
11月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
2292 0
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
807 4
|
网络协议 Java
springboot配置hosts文件
springboot配置hosts文件
312 11
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
420 2