SpringBoot文件上传功能的实现方法

目录
  • 1.应用实例
  • 2.代码实现
  • 3.引出两个问题

1.应用实例

需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片

2.代码实现

代码实现-文件上传

创建 templates/upload.html , 要求头像只能选择一个, 而宠物可以上传多个图片

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>upload</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center">
    <h1>注册用户~</h1>
    <form action="#" th:action="@{/upload}" method="post" enctype="multipart/form-data">
        用户名:<input type="text" style="width:150px" name="name"/><br/><br/>
        电 邮:<input type="text" style="width:150px" name="email"/><br/><br/>
        年 龄:<input type="text" style="width:150px" name="age"/><br/><br/>
        职 位:<input type="text" style="width:150px" name="job"/><br/><br/>
        头 像:<input type="file" style="width:150px" name="header"><br/><br/>
        宠 物:<input type="file" style="width:150px" name="photos" multiple><br/><br/>
        <input type="submit" value="注册"/>
        <input type="reset" value="重新填写"/>
    </form>
</div>
<hr/>
</body>
</html>

2.创建src\main\java\com\llp\springboot\controller\UploadController.java

@Slf4j
@Controller
public class UploadController {
    //处理转发到用户注册-可以完成文件上传页面
    @GetMapping("/upload.html")
    public String uploadPage() {
        return "upload";// 视图解析,转发到templates/upload.html
    }
    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("name") String name,
                         @RequestParam("email") String email,
                         @RequestParam("age") Integer age,
                         @RequestParam("job") String job,
                         @RequestParam("header") MultipartFile header,
                         @RequestParam("photos") MultipartFile[] photos) throws IOException {
        log.info("name:{},email:{},age:{},job:{},header.size:{},photos.length:{}",name,email,age,job,header.getSize(),photos.length);
        //1.获取源文件名称
        String originalFilename = header.getOriginalFilename();
        // /E:/IdeaProjects/springboot-sysuser/target/classes/
        String path = ResourceUtils.getURL("classpath:").getPath();
        System.out.println(path);
        File file = new File(path+"static/images/upload/");
        if(!file.exists()){
            file.mkdirs();
        }
        header.transferTo(new File(path+"static/images/upload/"+originalFilename));
        return "注册用户成功/文件上传成功";
    }
}

3.引出两个问题

1.文件覆盖问题

上面的示例中实现了文件的上传,但当两个不同的文件文件名相同时会存在文件覆盖的问题,如何解决呢?

@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("name") String name,
                     @RequestParam("email") String email,
                     @RequestParam("age") Integer age,
                     @RequestParam("job") String job,
                     @RequestParam("header") MultipartFile header,
                     @RequestParam("photos") MultipartFile[] photos) throws IOException {
    log.info("name:{},email:{},age:{},job:{},header.size:{},photos.length:{}",name,email,age,job,header.getSize(),photos.length);
    //1.获取源文件名称
    String originalFilename = header.getOriginalFilename();
    originalFilename = UUID.randomUUID().toString().replaceAll("-","")+System.nanoTime()+originalFilename;
    //2.获取文件上传的路径
    // /E:/IdeaProjects/springboot-sysuser/target/classes/
    String path = ResourceUtils.getURL("classpath:").getPath();
    System.out.println(path);
    //3.动态的创建文件上传目录
    File file = new File(path+"static/images/upload/");
    if(!file.exists()){
        file.mkdirs();
    }
    //4.将文件传输到目标目录
    header.transferTo(new File(path+"static/images/upload/"+originalFilename));
    return "注册用户成功/文件上传成功";
}

originalFilename = UUID.randomUUID().toString().replaceAll("-","")+System.nanoTime()+originalFilename;,实现思路就是给上传的文件重新指定一个不重复的文件名

2.将文件都上传到一个目录下,当上传文件很多时,会造成访问文件速度变慢

解决思路:将文件上传到不同目录 比如 一天上传的文件,统一放到 一个文件夹 年/月/日, 比如 2022/11/11 目录

public class WebUtils {
    //定义一个文件上传的路径
    public static String  UPLOAD_FILE_DIRECTORY = "static/images/upload/";
    //编写方法,生成一个目录-根据当前日期 年/月/日
    public static String getUploadFileDirectory() {
        return UPLOAD_FILE_DIRECTORY + new SimpleDateFormat("yyyy/MM/dd").format(new Date());
    }
}
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("name") String name,
                     @RequestParam("email") String email,
                     @RequestParam("age") Integer age,
                     @RequestParam("job") String job,
                     @RequestParam("header") MultipartFile header,
                     @RequestParam("photos") MultipartFile[] photos) throws IOException {
    //输出获取到的信息
    log.info("上传的信息 name={} email={} age={} job={} header={} photos={} ",
            name, email, age, job, header.getSize(), photos.length);
    //得到类路径(运行的时候)
    String path = ResourceUtils.getURL("classpath:").getPath();
    //log.info("path={}", path);
    //动态创建指定目录
    File file = new File(path + WebUtils.getUploadFileDirectory());
    if (!file.exists()) {//如果目录不存在,我们就创建, 在java io
        file.mkdirs();
    }
    if (!header.isEmpty()) {//处理头像
        //获取上传文件的名字
        String originalFilename = header.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + "_" + System.currentTimeMillis() + "_" + originalFilename;
        //保存到动态创建的目录
        header.transferTo(new File(file.getAbsolutePath() + "/" + fileName));
    }
    //处理多个文件
    if (photos.length > 0) {
        for (MultipartFile photo : photos) {//遍历
            if (!photo.isEmpty()) {
                String originalFilename = photo.getOriginalFilename();
                String fileName = UUID.randomUUID().toString() + "_" + System.currentTimeMillis() + "_" + originalFilename;
                //保存到动态创建的目录
                photo.transferTo(new File(file.getAbsolutePath() + "/" + fileName));
            }
        }
    }
    return "注册用户成功/文件上传成功";
}

到此这篇关于SpringBoot文件上传功能的实现方法的文章就介绍到这了,更多相关SpringBoot文件上传内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot上传文件大小受限问题的解决办法

    目录 1.控制台异常 2.上传文件默认参数 3.解决方法 3.1.方法1(在配置文件.yml或者.properties中直接修改参数) 3.2.方法2(自定义config配置类) 总结 今天在做项目学习的过程中,需要用到文件上传,启动项目正常,访问上传post请求突然报出了一个异常,特此记录一下. 1.控制台异常 org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceed

  • Java SpringBoot实现文件上传功能的示例代码

    测试代码 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org

  • SpringBoot实现文件上传与下载功能的示例代码

    目录 Spring Boot文件上传与下载 举例说明 1.引入Apache Commons FileUpload组件依赖 2.设置上传文件大小限制 3.创建选择文件视图页面 4.创建控制器 5.创建文件下载视图页面 6.运行 Spring Boot文件上传与下载 在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设置为multipart/form-data.只有这种设置,浏览器才能将所选文件的二进制数据发送给服务器. 从Servlet 3.0开

  • SpringBoot实现简单文件上传功能

    通过 SpringBoot 实现了表单下的文件上传,前后端分离情况下的文件上传.本案例不连接数据库,只做基本的文件上传操作. 在 SpringBoot 中不需要额外导入其他依赖,正常引入即可. 后端 controller 的写法 package com.dailyblue.java.controller;   import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.

  • SpringBoot后端上传文件类型检测方式

    目录 本文通过文件流头部判断文件类型 1.添加配置文件checkFileHeader.properties 2.编写读取properties文件类 3.编写拦截器 4.配置拦截文件 文件上传大部分通过web前端判断后尾名或者service后端判断后尾名,这种操作具有一定的风险,比如:我可以将一个jsp页面,修改后尾名改成jpg文件进行上传,由于图片预览功能,这个文件会被执行,这时就可以发送用户数据到指定的服务下,窃取用户信息. 本文通过文件流头部判断文件类型 不同的文件具有不同的头部,比如: 不

  • Springboot上传文件时提示405问题及排坑过程

    目录 Springboot上传文件时提示405 解决方案1 解决方案2 Springboot使用过程中遇到的一些问题 异常一 异常二:Mysql连接报错 异常三:整合Druid密码解密失败 Springboot上传文件时提示405 问题描述:上传文件时请求不通,状态码返回405,如下图:  问题分析:405 Method Not Allowed,请求行中指定的请求方法不能被用于请求相应的资源.该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表.简单说就是请求方法不支持

  • SpringBoot文件上传大小设置方式(yml中配置)

    目录 文件上传大小设置 上传文件大小yml参数配置 解决方法 文件上传大小设置 #文件大小 MB必须大写 #  maxFileSize 是单个文件大小 #  maxRequestSize是设置总上传的数据大小 spring:   servlet:     multipart:       enabled: true       max-file-size: 20MB       max-request-size: 20MB 提示: 必须配置,如果采用默认的配置,稍大的文件就不能上传了. 上传文件

  • SpringBoot 上传文件判空以及格式检验流程

    目录 加入依赖 创建自定义注解以及实现类 全局异常处理 使用示例 结果展示 基于jsr303 通过自定义注解实现,实现思路: 存在一些瑕疵,后续补充完善. 加入依赖 部分版本已不默认自动引入该依赖,选择手动引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </d

  • SpringBoot文件上传功能的实现方法

    目录 1.应用实例 2.代码实现 3.引出两个问题 1.应用实例 需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片 2.代码实现 代码实现-文件上传 创建 templates/upload.html , 要求头像只能选择一个, 而宠物可以上传多个图片 <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <

  • Spring MVC环境中文件上传功能的实现方法详解

    前言 我们在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上传和下载有或多或少的封装,这里就以Spring MVC环境中文件的上传为例,讲解Spirng MVC环境下的文件上传功能实现.下面话不多说了,来一起看看详细的介绍吧. 一.客户端编程 由于多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单

  • springboot 文件上传大小配置的方法

    springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean 首先第一种: application.properties中添加 spring.http.multipart.maxFileSize=10Mb spring.http.multipart.maxRequestSize=10Mb maxFileSize 是单个文件大小 maxRequestSize是设置总上传的数据大小 这就可以了. 根据自己需求定义吧,Mb和Kb都可以,大小写也都随意,L

  • Springboot文件上传功能简单测试

    在static文件夹中创html页面 内容为: <html> <head></head> <body> <form action="/fileuploadContorller" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> &l

  • Android基于Http协议实现文件上传功能的方法

    本文实例讲述了Android基于Http协议实现文件上传功能的方法.分享给大家供大家参考,具体如下: 注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText timel

  • Laravel框架文件上传功能实现方法示例

    本文实例讲述了Laravel框架文件上传功能实现方法.分享给大家供大家参考,具体如下: 以Laravel 5.2.45 框架为主,进行文件上传功能的实现如下: 实现步骤: (1). 配置文件修改 打开 config/filesystems.php 文件 在 'disks' 数组中添加如下代码 //自定义 'uploads' => [ 'driver' => 'local', //'root' => storage_path('app/uploads'), 'root' => pub

  • springboot+thymeleaf 文件上传功能的实现代码

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifa

  • SpringCloud实现文件上传功能的方法详解

    目录 图片上传 搭建项目 编写上传功能 图片上传 刚才的新增实现中,我们并没有上传图片,接下来我们一起完成图片上传逻辑. 文件的上传并不只是在品牌管理中有需求,以后的其它服务也可能需要,因此我们创建一个独立的微服务,专门处理各种上传. 搭建项目 创建SpringCloud项目 添加依赖 我们需要EurekaClient和web依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo

  • java 网络编程之TCP通信和简单的文件上传功能实例

    TCP通信需要明确的几点: tcp通信是面向连接的,需要先启动服务端,再启动客户端. 客户端和服务端都要创建套接字对象,客户端需要指定服务端套接字(ip+port),而服务端必须指定服务端口. Socket client_socket = new Socket("192.168.100.17",8888); //客户端套接字(Socket类的套接字为已连接套接字) ServerSocket listen_socket = new ServerSocket(8888); //服务端套接字

随机推荐