Spring Boot 文件上传

Stella981
• 阅读 584

通过 MultipartFile 来处理文件上传:

public String handleFormUpload(String name,MultipartFile file) throws IOException {
    if(!file.isEmpty){
        String fileName = file.getOriginalFilename();
        InputStream ins = file.getInputStream();
        
        // ...
        
        return "success";
    }
    return "failure";
}

MultipartFile 提供了一下方法来获取上传文件的信息。

  1. getOriginalFilename 获取上传文件的名字。
  2. getBytes 获取上传文件内容,转为字节数组。
  3. getInputStream 获取一个 InputStream
  4. isEmpty 上传文件内容为空,或者就没有文件上传
  5. getSize 文件上传的大小
  6. transferTo(File dest)保存上传文件到目标文件系统。

在 HTML 前端的代码

<form enctype="multipart/form-data" method="POST">
    <input type="file" multiple="multiple" name="file">
</form>

可以通过配置文件 application.properties 对 Spring Boot 上传的文件进行限定。

spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=0
spring.servlet.multipart.location=
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.resolve-lazily=false

参数 enabled 默认为 true,即允许附件上传。

file-size-threshold 限定了当上传的文件超过一定长度时,就先先写到临时文件里。这有助于上传文件不占用过多内存,单位时 MB 或者 KB。默认是0,不限定阈值。

location 值指的是临时文件的存放目录,如果不限定,则是 Web 服务器提供的一个临时目录。

max-file-size 属性指定了单个文件的最大长度,默认是 1 MB

max-request-size 属性说明单次 HTTP 请求上传的最大长度,默认 10 MB

通过 Ajax 来上传文件。

$.ajax({    
     url : "http://localhost:8080/STS/rest/user",    
     type : "POST",    
     data : $( '#postForm').serialize(),    
     success : function(data) {    
          $( '#serverResponse').html(data);    
     },    
     error : function(data) {    
          $( '#serverResponse').html(data.status + " : " + data.statusText + " : " + data.responseText);    
     }    
}); 

通常我们提交(使用submit button)时,会把form中的所有表格元素的name与value组成一个queryString,提交到后台。这用jQuery的方法来说,就是serialize。

通过$('#postForm').serialize()可以对form表单进行序列化,从而将form表单中的所有参数传递到服务端。

但是上述方式,只能传递一般的参数,上传文件的文件流是无法被序列化并传递的。 不过如今主流浏览器都开始支持一个叫做FormData的对象,有了这个FormData,我们就可以轻松地使用Ajax方式进行文件上传了。

使用 Form Data 来上传文件

XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件。

获取一个 FormData 对象有三种方式

  1. 创建一个空的 FormData 对象

    var formdata = new FormData()
    formdata.append("name","Yang")
    formdata.append("url","http://dowhile.net")
    
  2. 取得form元素对象,将它作为参数传入FormData对象中

    var formobj = document.getElementById("form") var formdata = new FormData(formobj)

  3. 利用form元素对象的getFormData方法生成它

    var formobj = document.getElementById("form") var formdata = formobj.getFormData()

FormData 对象的一些常用方法

  1. FormData.append 本方法用于向已存在的键添加新的值,如该键不存在,新建之。
  2. FormData.delete 将一对键和值从 FormData 对象中删除。 formData.delete(username)
  3. FormData.get 返回给定键的所有值
  4. FormData.has 检查是否包含给定键,返回 true 或 false

Ajax通过FormData上传文件

<form id="uploadForm" enctype="multipart/form-data">
    <input id="file" type="file" name="file"/>
    <button id="upload" type="button">upload</button>
</form>


$.ajax({
    url: '/upload',
    type: 'POST',
    cache: false,
    data: new FormData($('#uploadForm')[0]),
    processData: false,
    contentType: false
}).done(function(res) {
}).fail(function(res) {});

这里要注意几点:

  1. processData设置为false。因为data值是FormData对象,不需要对数据做处理。

  2. 标签添加enctype="multipart/form-data"属性。
  3. cache设置为false,上传文件不需要缓存。

  4. contentType设置为false,不设置contentType值,因为是由表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这