首页 > 其他分享 >springboot文件上传

springboot文件上传

时间:2023-06-15 16:13:22浏览次数:32  
标签:文件 springboot format req new folder 上传 String

前言

需要实现文件上传功能需要 MultipartResolver 接口的实现类的实例,这样才可以实现文件上传

MultipartResolver 有两个实现类:

  • StandardServletMultipartResolver:springboot 中以自动配置完成,直接使用即可
  • CommonsMultipartResolver:springmvc中使用的是CommonsMultipartResolver,需要在springmvc中配置其bean,其兼容性较好,也是传统ssm中使用

而在 MultipartAutoConfiguration 类中为 springboot 配置了其 StandardServletMultipartResolver的bean

@AutoConfiguration
@ConditionalOnClass({Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class})
@ConditionalOnProperty(
    prefix = "spring.servlet.multipart",
    name = {"enabled"},
    matchIfMissing = true
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({MultipartProperties.class})
public class MultipartAutoConfiguration {
    @Bean(
        name = {"multipartResolver"}
    )
    @ConditionalOnMissingBean({MultipartResolver.class})
    public StandardServletMultipartResolver multipartResolver() {
        StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
        multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
        return multipartResolver;
    }
}

在配置文件中可以通过 spring.servlet.multipart. 来配置文件上传设置。

第一种 单文件上传

1、页面准备

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/load" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>
</body>
</html>

在 from 表单中通过 enctype 来设置表单的数据构成,

multipart/form-data:是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。

默认情况下,enctype 的值是 application/x-www-form-urlencoded,不能用于文件上传,只有使用了 multipart/form-data,才能完整的传递文件数据。

文件上传输入框中必须要有 name 属性,且控制器方法中的参数名也需和 name 属性值对应,否则传输到控制器中不存在。

2、控制器方法

@RestController
public class UploadFileController {
    //设置时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
    @PostMapping("/load")
    public String upload(MultipartFile file, HttpServletRequest req){//参数名需要与form表单中设置的 name属性值对应上,否则获取到的为null
        //1、处理文件位置
        //文件存放位置
        String realPath = req.getServletContext().getRealPath("/");
        //按照时间格式划分
        String format = sdf.format(new Date());
        String path = realPath + format;
        //文件夹
        File folder = new File(path);
        //判断文件是否存在
        if (!folder.exists()){//不存在,则创建
            //这里需要使用mkdirs,因为为多层目录
            folder.mkdirs();
        }
        //2、处理文件名
        //获取文件后缀+文件名
        String oldName = file.getOriginalFilename();
        //将后缀加到新的文件名上
        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
        try {
            //文件保存
            file.transferTo(new File(folder,newName));
            //获取请求协议                            获取主机名                       获取端口
            String s = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + format + newName;//文件的访问路径
            return s;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

}

第二种 多文件上传

方式一:一步多文件

1、页面准备

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/load2" method="post" enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <input type="submit" value="上传">
</form>
</body>
</html>

在页面中将输入文件框中添加 mutiple 属性,表示可以上传多个文件

文件上传输入框中必须要有 name 属性,且控制器方法中的参数名也需和 name 属性值对应,否则传输到控制器中不存在。

2、控制器方法

@RestController
public class UploadFileController2 {
    //设置时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
    @PostMapping("/load2")
    public void upload(MultipartFile[] files, HttpServletRequest req){//参数名需要与form表单中设置的 name属性值对应上,否则获取到的为null
        //1、处理文件位置
        //文件存放位置
        String realPath = req.getServletContext().getRealPath("/");
        //按照时间格式划分
        String format = sdf.format(new Date());
        String path = realPath + format;
        //文件夹
        File folder = new File(path);
        //判断文件是否存在
        if (!folder.exists()){//不存在,则创建
            //这里需要使用mkdirs,因为为多层目录
            folder.mkdirs();
        }
        try {
            for (MultipartFile file : files) {
                //2、处理文件名
                //获取文件后缀+文件名
                String oldName = file.getOriginalFilename();
                //将后缀加到新的文件名上
                String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
                //文件保存
                file.transferTo(new File(folder, newName));
                //获取请求协议                            获取主机名                       获取端口
                String s = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + format + newName;//文件的访问路径
                System.out.println("s = " + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

与单文件上传类似,不过在文件保存时,需要放在循环中,依次保存

异常捕获 与 循环同时存在时,需要将 循环放置于 异常捕获中,这样效率高一点

方式二:多步多文件

1、页面准备

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/load3" method="post" enctype="multipart/form-data">
    <input type="file" name="file1">
    <input type="file" name="file2">
    <input type="submit" value="上传">
</form>
</body>
</html>

在页面中设置多个 文件上传框,来实现多文件上传

2、控制器方法

@RestController
public class UploadFileController3 {
    //设置时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
    @PostMapping("/load3")
    public void upload(MultipartFile file1,MultipartFile file2, HttpServletRequest req){//参数名需要与form表单中设置的 name属性值对应上,否则获取到的为null
        //1、处理文件位置
        //文件存放位置
        String realPath = req.getServletContext().getRealPath("/");
        //按照时间格式划分
        String format = sdf.format(new Date());
        String path = realPath + format;
        //文件夹
        File folder = new File(path);
        //判断文件是否存在
        if (!folder.exists()){//不存在,则创建
            //这里需要使用mkdirs,因为为多层目录
            folder.mkdirs();
        }
        //2、处理文件名
        //获取文件后缀+文件名
        String oldName1 = file1.getOriginalFilename();
        //将后缀加到新的文件名上
        String newName1 = UUID.randomUUID().toString() + oldName1.substring(oldName1.lastIndexOf("."));
        try {
            //文件保存
            file1.transferTo(new File(folder,newName1));
            //获取请求协议                            获取主机名                       获取端口
            String s = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + format + newName1;//文件的访问路径
            System.out.println("s = " + s);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //2、处理文件名
        //获取文件后缀+文件名
        String oldName2 = file2.getOriginalFilename();
        //将后缀加到新的文件名上
        String newName2 = UUID.randomUUID().toString() + oldName2.substring(oldName2.lastIndexOf("."));
        try {
            //文件保存
            file2.transferTo(new File(folder,newName2));
            //获取请求协议                            获取主机名                       获取端口
            String s = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + format + newName2;//文件的访问路径
            System.out.println("s = " + s);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

在控制器方法中的参数,需要设置相同名称、数量的参数来与页面中文件上传框中对应

第三种 ajax文件上传

此方式也可进行多文件上传,方式与上述差不多。

1、页面准备

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://code.jquery.com/jquery-3.7.0.js" integrity="sha256-JlqSTELeR4TLqP0OG9dxM7yDPqX1ox/HfgiSLBj8+kM=" crossorigin="anonymous"></script>
</head>
<body>
<div id="result"></div>
<input type="file" id="file">
<input type="button" value="上传" onclick="fileUpLoad()">
<script>
   function fileUpLoad() {
       var file = $("#file")[0].files[0];
       var formData = new FormData();
       formData.append("file",file);
       $.ajax({
           type:'post',
           url:'/loadajax',
           processData:false,
           contentType:false,
           data:formData,
           success:function (msg){
                $("#result").html(msg);
           }
       })
   }
</script>
</body>
</html>

2、控制器方法

public class AjaxUploadFileController {
    //设置时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
    @PostMapping("/loadajax")
    public String upload(MultipartFile file, HttpServletRequest req){//参数名需要与form表单中设置的 name属性值对应上,否则获取到的为null
        //1、处理文件位置
        //文件存放位置
        String realPath = req.getServletContext().getRealPath("/");
        //按照时间格式划分
        String format = sdf.format(new Date());
        String path = realPath + format;
        //文件夹
        File folder = new File(path);
        //判断文件是否存在
        if (!folder.exists()){//不存在,则创建
            //这里需要使用mkdirs,因为为多层目录
            folder.mkdirs();
        }
        //2、处理文件名
        //获取文件后缀+文件名
        String oldName = file.getOriginalFilename();
        //将后缀加到新的文件名上
        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
        try {
            //文件保存
            file.transferTo(new File(folder,newName));
            //获取请求协议                            获取主机名                       获取端口
            String s = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + format + newName;//文件的访问路径
            return s;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

}

标签:文件,springboot,format,req,new,folder,上传,String
From: https://www.cnblogs.com/xiarongblogs/p/17483177.html

相关文章

  • c#.net WebUploader 分块上传
    ​ 以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传  可以带参数        [HttpPost("upload")]        publicJsonResultuploadProject(I......
  • 利用 inotifywait 实现自动增量文件拷贝
    #!/bin/bashsrc=/www/wwwroot/site0/images/dest=/www/wwwroot/site1/images/tool=/user/bin/mytoolinotifywait-mrq--format'%w%f'-ecreate$src|whilereadfiledosleep1#从create到写好,有一个过程,等一下更安全rpath=$dest/${file:2......
  • python unitest 文件结构
    unittest框架的文件结构可以按照以下方式组织:1.导入所需的模块和类:在测试文件的开头,需要导入unittest模块以及待测试的模块或类。2.定义测试类:使用class关键字定义一个测试类,类名通常以"Test"开头,并继承unittest.TestCase类。3.定义测试方法:在测试类中,可以定义多个......
  • React图片上传组件设计
    本文讨论React图片上传组件的正确设计思路。程序员对React图片上传组件主要有如下几点关心:界面方面:自动提供图片预览功能,能删除错传的图,传图数量限制等。编程方面:上传时机是否可以外部编程控制,如果是(1)即拍即传,则不能控制也无妨,如果是(2)批量上传,则外部需要有能力控制上传时机;每一张图......
  • python发送文件
      发送端importsocketimportosimporttimefilename=input('pleaseenterthefilenameyouwanttosend:\n')filesize=str(os.path.getsize(filename))fname1,fname2=os.path.split(filename)client_addr=('127.0.0.1',9999)f=op......
  • springboot 自定义listener 添加环境变量。 抄的springboot项目去掉了一些不用的ja
    1.自定义listener实现 ApplicationListener<ApplicationEnvironmentPreparedEvent>,Ordered(如果要设置优先级可以实现Ordered接口,注意order值越小优先级越高)publicclassMyListenerimplementsApplicationListener<ApplicationEnvironmentPreparedEvent>,Ordered{......
  • ajax请求springboot
    老是忘记ajax请求格式,记录一下吧后面看自己的functionsave(){varURL="/reconciliation/wzglWzMaterilApplicationDetail/saveSupplier";varcc=JSON.stringify({data:"world",p:{pag:0,pageS......
  • springboot项目启动失败之 org.springframework.boot.env.OriginTrackedYamlLoader.cr
    1、检查一下父项目的module的依赖是否,以及版本是否一致。例如<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.30</version></dependency>2、如何知道自己的org.yaml的版本,可以双击Shift键,输入如图所示,注意划红线的地方就是......
  • asp.net WebUploader 分块上传
    ​IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传......
  • C语言文件操作函数open、write用法速记
    以前一直都是用fopen、fwrite等高级函数写文件,这次尝试用open、write、close操作文件。代码如下:intret=OB_SUCCESS;intfd=open(config_file,O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU|S_IRWXG|S_IRWXO);staticconstint64_tbuf_len=512;int64_......