Spring Boot 文件上传

通过 MultipartFile 来处理文件上传:

1public String handleFormUpload(String name,MultipartFile file) throws IOException { 2 if(!file.isEmpty){ 3 String fileName = file.getOriginalFilename(); 4 InputStream ins = file.getInputStream(); 5 6 // ... 7 8 return "success"; 9 } 10 return "failure"; 11}

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

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

在 HTML 前端的代码

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

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

1spring.servlet.multipart.enabled=true 2spring.servlet.multipart.file-size-threshold=0 3spring.servlet.multipart.location= 4spring.servlet.multipart.max-file-size=1MB 5spring.servlet.multipart.max-request-size=10MB 6spring.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 来上传文件。

1$.ajax({ 2 url : "http://localhost:8080/STS/rest/user", 3 type : "POST", 4 data : $( '#postForm').serialize(), 5 success : function(data) { 6 $( '#serverResponse').html(data); 7 }, 8 error : function(data) { 9 $( '#serverResponse').html(data.status + " : " + data.statusText + " : " + data.responseText); 10 } 11});

通常我们提交(使用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 对象

    1var formdata = new FormData() 2formdata.append("name","Yang") 3formdata.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上传文件

1<form id="uploadForm" enctype="multipart/form-data"> 2 <input id="file" type="file" name="file"/> 3 <button id="upload" type="button">upload</button> 4</form> 5 6 7$.ajax({ 8 url: '/upload', 9 type: 'POST', 10 cache: false, 11 data: new FormData($('#uploadForm')[0]), 12 processData: false, 13 contentType: false 14}).done(function(res) { 15}).fail(function(res) {});

这里要注意几点:

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )