SpringBoot——文件上传

Posted 6。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot——文件上传相关的知识,希望对你有一定的参考价值。

单文件上传

表单上传

1.前端表单

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="提交">
</form>

2.后端接收

    @PostMapping("/upload")
    public String upload(MultipartFile file, HttpServletRequest req) {
        SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
        String format = sdf.format(new Date());
        String realPath = req.getServletContext().getRealPath("/img") + format;
        File folder = new File(realPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        String oldName = file.getOriginalFilename();
        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
        try {
            file.transferTo(new File(folder, newName));
            String url = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/img" + format + newName;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "error";
    }

ajax上传

1.前端

<div id="result"></div>
<input type="file" id="file">
<input type="button" value="上传" onclick="uploadFile()">


<script>
    function uploadFile() {
        var file = $("#file")[0].files[0];
        var formData = new FormData();
        formData.append("file", file);
        $.ajax({
            type:'post',
            url:'/upload',
            processData:false,
            contentType:false,
            data:formData,
            success:function (msg) {
                $("#result").html(msg);
            }
        })
    }
</script>

2.后端相同

多文件上传

表单上传

1.前端

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">  //此时选择多个文件
    <input type="file" name="file">  //或者使用多个input标签
    <input type="submit" value="提交">
</form>

2.后端

   @PostMapping("/uploads") 
    public String uploads(MultipartFile[] files,  //如果使用同一个名称,使用数组接收,如果不是同一名称,定义多个MultipartFile
                          HttpServletRequest req) {
        SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
        String format = sdf.format(new Date());
        String realPath = req.getServletContext().getRealPath("/img") + format;
        File folder = new File(realPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        for (MultipartFile file : files) {
            String oldName = file.getOriginalFilename();
            String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
            try {
                file.transferTo(new File(folder, newName));
                String url = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/img" + format + newName;
                System.out.println(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "success";
    }

ajax上传

1.前端

<div id="result"></div>
<input type="file" name="Files" id="Files" multiple="multiple" value="上传Files" />
<input type="button" value="上传" onclick="uploadFile()">
<script>
    function uploadFile() {
        var formData = new FormData();//就像cookie一样用,存入files[i];;数组形式
        var files = document.getElementById("Files").files;
        for (var i = 0; i < files.length ; i++)
            {
                formData.append("files_"+i, files[i]);
            }
        $.ajax({
                url: "/uploads",//请求地址
                dataType: "json",//数据格式
                type: "POST",//请求方式
                async: true,//是否异步请求
                cache: false,//上传文件无需缓存
                contentType: false,//必须
                processData: false,//用于对data参数进行序列化处理 这里必须false
                data: formData,
                success: function (data) {
                }
            })
    }
</script>

2.后端一致

文件上传配置

方法一:在配置文件中添加配置

#静态资源对外暴露的访问路径
file.staticAccessPath=/static/image/**
#文件上传目录(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/root/uploadFiles/
file.uploadFolder=d://uploadFiles/? ?#特别要注意此位置
#文件大小设置
spring.servlet.multipart.enabled=true  #是否支持 multipart 上传文件
spring.servlet.multipart.max-file-size=30MB ?#设置单个文件的大小
spring.servlet.multipart.max-request-size=100MB  ?#设置总上传的数据大小
spring.servlet.multipart.file-size-threshold=0,支持文件写入磁盘
spring.servlet.multipart.location=,上传文件的临时目录
spring.servlet.multipart.resolve-lazily=false,是否支持 multipart 上传文件时懒加载

方法二:在启动类中添加Bean配置

启动类 或 配置类

  /** 
   * 文件上传配置 
   * @return 
   */
  @Bean
  public MultipartConfigElement multipartConfigElement() { 
    MultipartConfigFactory factory = new MultipartConfigFactory(); 
    // 单个文件数据大小 
    factory.setMaxFileSize("10240KB"); //KB,MB 
    // 设置总上传数据总大小 
    factory.setMaxRequestSize("102400KB"); 
    // 设置文件路径
    factory.setLocation(PropertyUtil.getPropertValueByKey("rootpath"));
    return factory.createMultipartConfig(); 
  } 

踩坑经验

https://www.jianshu.com/p/d8666f2e698f

以上是关于SpringBoot——文件上传的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot2----拦截器和文件上传功能

java Ftp上传创建多层文件的代码片段

SpringBoot单文件与多文件上传

上传文件慢,SpringBoot分片上传文件

上传文件慢,SpringBoot分片上传文件

上传文件慢,SpringBoot分片上传文件