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应用中添加文件上传功能。通过学习本文内容,你可以更加深入地理解文件上传的实现原理,从而在实际项目中应用和扩展该功能。

相关文章
|
5天前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
21 3
|
5天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
20 0
|
29天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
36 0
|
18天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
15天前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
55 8
|
16天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2
|
20天前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
23 1
|
24天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。
|
前端开发 JavaScript Java
SpringBoot实现国际化i18n功能
SpringBoot实现国际化i18n功能
1091 0
SpringBoot实现国际化i18n功能
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
144 1