SpringBoot+Vue上传文件

article/2025/6/21 0:25:10

最近在研究SpringBoot+Vue的文件上传,踩了不少坑。现在将正确的文件上传流程分享一下。

一、前端采用ElementUI组件

前端页面完整代码:

<template><el-uploadclass="upload-demo"action="http://localhost:1111/01/fileup":on-preview="handlePreview"  //钩子的值是方法名,即钩子被触发后要执行的函数:on-remove="handleRemove":before-remove="beforeRemove"multiple:limit="3":on-change="handChange":on-exceed="handleExceed":auto-upload="false"//上传的文件保存在fileList中:file-list="fileList"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div><el-button size="small" @click="fileup">提交</el-button></el-upload>
</template><script>export default {name: "fileup",data() {return {currentFile:[]    //作为存储中介,保存当前fileList已经添加的文件,用于axios发送文件}},methods: {handleRemove(file, fileList) {console.log(file, fileList);},handlePreview(file) {console.log(file);},handChange(file,fileList){       //一旦选中文件,就将该文件添加到currentFile中this.currentFile.push(file)},handleExceed(files, fileList) {this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);},beforeRemove(file, fileList) {return this.$confirm(`您确定要移除 ${ file.name }吗?`);},fileup(){//必须使用FormData对象向后台传递文件let formData=new FormData();let key;//将待提交的文件放到FormData对象中,必须挨个放for (key in this.currentFile){formData.append("currentFile",this.currentFile[key].raw)}this.axios({method:'post',data:formData,url:'http://localhost:1111/01/fileup'}).then(function(resp){console.log(resp.data);})}}}
</script><style scoped>
</style>

1、< el-upload>组件属性的解释

(1)action:这个属性是上传文件的地址。当我们指定了 auto-upload 属性,组件就会自动按 action 的地址提交。如果设置这个属性action=“none”,可以进行自定义,拓展性强。
(2)auto-upload:自动上传(选中文件立即上传),默认值是true,最好是设置为false,这样可以在点击提交按钮再提交。
(3)limit: 限制了上传文件的个数 。
(4)multiple:这个属性支持多文件上传,如果你是上传单文件这个属性设不设置都可以,如果是多文件,就要设置。
(5)accept:限制选择文件的类型。
(6)on-preview:当你选择文件后会显示已选择的文件列表,当你点击那个文件列表的的文件,就会触发钩子执行函数。
(7)before-upload:当你上传文件之前触发的函数(注意是上传文件前而不是选择文件之前)。
(8)on-remove:文件列表移除文件触发。

2、钩子函数参数的解释

handleRemove(file, fileList) {console.log(file, fileList);         },
handlePreview(file) {console.log(file);},
handChange(file,fileList){console.log(file);console.log(fileList)},
handleExceed(files, fileList) {}	

(1)file:最新选择的文件
(2)fileList:已经选择过的文件列表

3、提交按钮@click绑定axios请求向后台传递文件

(1)axios请求是在我们自定义的fileup()函数部分,表单的file和fileList的作用域并不包含该函数。

要在Vue的data属性中定义currentFile列表作为存储中介,存储表单选中的文件,并作为axios请求的参数。

(2)利用 FormData 对象,我们可以通过 JavaScript 用一些键值对(key-value)来模拟一系列表单控件。与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件。

必须使用FormData对象携带二进制文件向后台提交数据

(3)必须传递文件的raw属性!!!!!!!

let key;
for (key in fileList){     //挨个添加文件//第1个参数是存储的key,第2个参数是存储的valueformData.append("currentFile",fileList[key].raw)   //要传raw属性}

①往FormData对象中放file文件时不要直接把值传进去,而是传 raw 属性,这个才是文件。
②往FormData对象中放file文件时, 若文件为多个,一定要一个一个进行添加,否则不会正确的传值。
③若为多文件提交,append函数的第一个参数可以都设置为相同的,这样后台便于接收。

选择的文件的raw属性信息如下:
在这里插入图片描述
(4)axios请求如下
在这里插入图片描述
请求体表单参数为multipart/form-data格式。
在这里插入图片描述
请求体的表单数据为二进制类型。

二、后台接收文件并存储磁盘

后端完整代码

	@CrossOrigin(origins = "http://localhost:8080",maxAge = 3600)@PostMapping(value = "/fileup")//@RequestParam的参数值为前端FormData对象的存储内容的key值//多文件上传时,用MultipartFile[]数组进行接收,单文件也可以这样接收public String fileup(@RequestParam("currentFile") MultipartFile[] files, HttpServletRequest req) {System.out.println("接收到的文件有"+files.length+"个");for(MultipartFile f:files){System.out.println("正在存储"+f.getOriginalFilename()+"文件");String path = "e:/upload/";String name=f.getOriginalFilename();File floder=new File(path);if(!floder.isDirectory())floder.mkdirs();try{f.transferTo(new File(floder,name));} catch (Exception e) {e.printStackTrace();}}return "上传成功";}

1、配置文件设置接收文件参数

在配置文件application.properties中设置上传文件的参数:

spring.servlet.multipart.enabled=true	//是否开启文件上传支持,默认为true
spring.servlet.multipart.file-size-threshold=0	//文件写入磁盘的阈值,默认为0
spring.servlet.multipart.location=E:\\temp	//上传文件的临时保存位置
spring.servlet.multipart.max-file-size=1MB	//上传的单个文件的最大大小,默认为1MB
spring.servlet.multipart.max-request-size=10MB	//多文件上传时文件的总大小,默认为10MB
spring.servlet.multipart.resolve-lazily=false	//文件是否延迟解析,默认是false

2、数组接收多文件

(1)当前端传来多文件,后端用MultipartFile[]数组进行接收。
(2)在MultipartFile[]数组前面用@RequestParam("")指明该数组接收的FormData对象的存储内容的key值,因此前端在formData.append(“key”,value)添加文件时建议将所有上传文件的key设置成相同的,这样后端就可以只使用1个@RequestParam("key") MultipartFile[]接收所有的文件。

3、File文件操作

(1)创建文件

public File(String pathname)     //使用一个文件路径创建一个File类的对象
public File(String parent, String child)    //使用父路径和子路径结合代表文件路径

File f = new File(“d:\test\”,”1.txt”);
//这样代表的文件路径是:d:\test\1.txt。

(2)创建文件夹

File file=new File("D:\\test");
if(!file.exists()){     //如果文件夹不存在file.mkdir();      //创建文件夹

该方法的作用是创建当前文件文件夹,而不创建该路径中的其它文件夹。假设d盘下只有一个test文件夹,则创建d:\test\abc文件夹则成功,如果创建d:\a\b文件夹则创建失败,因为该路径中d:\a文件夹不存在。如果创建成功则返回true,否则返回false。

public boolean mkdirs()

该方法的作用是创建文件夹,如果当前路径中包含的父目录不存在时,也会自动根据需要创建

(3)createNewFile()

public boolean createNewFile() throws IOException

该方法的作用是创建指定的文件。该方法只能用于创建文件,不能用于创建文件夹,且文件路径中包含的文件夹必须存在。

(4)delete()

public boolean delete()

该方法的作用是删除当前文件或文件夹。如果删除的是文件夹,则该文件夹必须为空。如果需要删除一个非空的文件夹,则需要首先删除该文件夹内部的每个文件和文件夹,然后在可以删除,这个需要书写一定的逻辑代码实现。

(5)exists()

public boolean exists()

该方法的作用是判断当前文件或文件夹是否存在。

(6)isDirectory()

public boolean isDirectory()

该方法的作用是判断当前File对象是否是目录。

(7)isFile()

public boolean isFile()

该方法的作用是判断当前File对象是否是文件

(8)getAbsolutePath()

public String getAbsolutePath()

该方法的作用是获得当前文件或文件夹的绝对路径。例如c:\test\1.t则返回c:\test\1.t。

(9)getName()

public String getName()

该方法的作用是获得当前文件或文件夹的名称。例如c:\test\1.t,则返回1.t。

(10)length()

public long length()

该方法的作用是返回文件存储时占用的字节数。该数值获得的是文件的实际大小,而不是文件在存储时占用的空间数

(11)list()

public String[] list()

该方法的作用是返回当前文件夹下所有的文件名和文件夹名称。说明,该名称不是绝对路径。

(12)listFiles()

public File[] listFiles()

该方法的作用是返回当前文件夹下所有的文件对象。

4、MultipartFile文件操作

(1)getBytes()

public byte[] getBytes()

获取文件数据

(2)getContentType[]

public String getContentType[]

获取文件类型,如image/jpeg等

(3)getInputStream()

public InputStream getInputStream()

获取文件流

(4)getName()

public String getName()

获取表单中文件组件的名字

(5)getOriginalFilename()

public getOriginalFilename()

获取上传文件的原名

(6)getSize()

public Long getSize()

获取文件的字节大小,单位为byte

(7)isEmpty()

public boolean isEmpty()

确定是否有上传文件

(8)transferTo()

public void transferTo(File dest)

将上传文件保存到一个目录文件中


http://chatgpt.dhexx.cn/article/v82OWH3I.shtml

相关文章

vue如何优雅的上传文件

vue如何优雅的上传文件 上传文件的方式1.表单提交文件2.Elementui封装的组件提交文件 上传文件的方式 下面是我使用过得两种提交方式&#xff0c;就详细说一下哈 1.表单提交文件 2.Elementui封装的组件提交文件 1.表单提交文件 html页面&#xff1a; 为了页面美观&#xff…

vue实现文件上传

记录问题&#xff0c;方便回顾 1、使用elementUI的 el-upload插件进行上传。 2、使用input。 1、使用elementUI的 el-upload插件进行上传。 html: <el-uploadref"avatar-uploader"class"avatar-uploader":show-file-list"false":auto-uploa…

Vue实现多文件上传

一、需求说明及展示 通过vue和element实现多文件上传 二、实现步骤 // 代码片<el-formref"dataForm"v-loading"formLoading":model"temp":inline"true"size"mini"label-position"right"label-width"8…

vue 实现文件上传

&#xff08;一&#xff09;首先实现html、css布局 代码&#xff1a; <template><div class"image-uploader"><img :src"uploadIcon" class"icon"/> <p>Drag your images here</p><p>OR</p><div …

vue文件上传和下载

文件上传 这里使用elementui组件库的文件上传组件 1.手动上传&#xff08;文件选取后需点击确认上传&#xff09; action&#xff1a;上传地址auto-upload&#xff1a;是否在选取文件后立即进行上传&#xff0c;默认true手动上传要将其设置为falsebefore-upload &#xff1a…

windows修改文件后缀名(文件扩展名)

1.直接修改 打开我的电脑->查看->文件拓展名 勾上即可 before \qquad\qquad\qquad\qquad\qquad after \qquad\qquad 2.任何文本编辑器->另存为->保存类型选所有文件

Windows11修改文件后缀名的方法

Windows11修改文件后缀名的方法 最近买了一台新电脑&#xff1a;suface pro8 新电脑是真的香啊&#xff0c;但是目前发现一个问题&#xff0c;就是windows11的环境对文件后缀名的可修改性不太友好。 他的自定义是对文件后缀名也看不见的&#xff0c;通过一些设置可以查看到文件…

window10 系统下如何修改文件后缀

文章目录 需求&#xff1a;修改后缀&#xff08;方法一&#xff09;&#xff1a;1、打开-- 文件扩展名&#xff1a;2、重名了文件&#xff1a; 修改后缀&#xff08;方法二&#xff0c;新增&#xff09;1、代码修改过程&#xff08;很简单&#xff0c;拖入&#xff0c;写入文件…

matlab 实现批量修改文件后缀名 案例

实现目标描述&#xff1a;选择我有一个大文件&#xff0c;里面有许多子文件夹&#xff0c;子文件夹内都是csv格式的文件&#xff0c;我现在将这个大文件内所有子文件夹的.csv文件的后缀名改为.sps文件 %author foddcus FAFU %用法&#xff1a;批量修改文件后缀名 clear all src…

如何修改文件后缀

文章目录 1.搜索“文件资源管理器选项”2.打开我的电脑选项 1.搜索“文件资源管理器选项” 点击查看、取消选择“隐藏拓展名”2.打开我的电脑选项 wine打开文件夹资源管理器&#xff0c;点击查看&#xff0c;点击“文件拓展名”

WIN10 如何修改 文件后缀名 设置后缀名可修改

管理员权限下&#xff1a;打开任意一个文件夹---查看---选中文件扩展名&#xff1a;这时 文件的后缀名就显示出来了&#xff0c;单击文件 就可以修改后缀名了

python文件操作3--批量修改文件后缀名

1、引言 需要把.dat 格式 转化成 .txt格式 2、实现 # python批量更换后缀名 import os# 列出当前目录下所有的文件 files os.listdir(.) for filename in files:portion os.path.splitext(filename)# 如果后缀是.datif portion[1] ".dat": # 重新组合文件名和…

怎么修改html后缀名,在win7系统下如何修改文件后缀名?win7修改文件后缀名html方法...

在win7系统默认情况下&#xff0c;直接在文件后面加上“.扩展名”&#xff0c;相当于给文件命名&#xff0c;而不是直接修改文件类型的。那么在win7系统下如何修改文件后缀名?下面小编就为大家介绍win7修改文件后缀名html方法&#xff0c;一起来看看吧&#xff01; 方法/步骤 …

linux 批量修改文件后缀名

今天遇到的一个问题&#xff0c;要将一批jpg文件后缀名更改为png&#xff0c;凭感觉能用awk指令进行修改&#xff0c;就进行了尝试。 想到的思路是&#xff1a;先列举出文件名称&#xff0c;再用awk对文件名称进行处理分割&#xff0c;最后将后缀名进行修改。 首先列举出文件…

批量修改后缀名的方法,批量修改文件后缀名

批量修改后缀名的方法&#xff0c;批量修改文件后缀名&#xff01;文件的后缀名就是文件的拓展名&#xff0c;有些小伙伴在工作中经常需要修改文件后缀名&#xff0c;这是一个并不困难的电脑操作&#xff0c;我们只需要选中文件然后鼠标右击它&#xff0c;点击重命名&#xff0…

Windows系统批量修改文件后缀名/扩展名

查看文件 查看文件是否有扩展名&#xff0c;没有后缀名通过ctrlE打开计算机&#xff0c;找到“工具”—>“文件夹选项”—>“查看”&#xff0c;取消勾选“隐藏已知文件类型的扩展名”&#xff0c;然后就可以看到文件的扩展名。如果打开扩展名后还是没有显示扩展名&#…

windows下如果批量修改文件的后缀名

背景 电脑上有几十个mp4格式的视频学习资料&#xff0c;这些资料都学完了&#xff0c;打算把它安全的封存起来&#xff0c;最有效的封存方法是把名字修改了&#xff0c;而且后缀名mp4删掉或者改成一个不常见的后缀名。 刚开始我是一个一个的重命名&#xff0c;这样发现太麻烦了…

怎么批量修改文件后缀名?

怎么批量修改文件后缀名&#xff1f;什么是文件的后缀名&#xff0c;相信大家都应该知道吧&#xff0c;例如一张图片的名称是“1.jpg”&#xff0c;那么“.jpg”就是文件的后缀名。工作中有时候我们需要对文件后缀名进行修改&#xff08;这里不是格式转换&#xff09;&#xff…

Python 实用技巧 —— 批量修改文件后缀(类型)

批量修改文件后缀&#xff08;属性&#xff09; 1.1 读取目录并切分1.2 获取文件前后缀名1.3 文件重命名思路1.4 os.rename 实现重命名1.5 批量修改文件属性 思路&#xff1a; 读取目录下文件的类型(os.listdir("…"))分割文件名与文件类型&#xff0c;以 ‘点’ 为…

windows10批量修改文件后缀名

windows10批量修改文件后缀名 步骤 1. 在windows开始栏中打开命令提示符&#xff0c; 也可以用快捷键:winR ,输入cmd&#xff0c;回车 2. cd到你需要修改后缀名的文件夹目录下&#xff0c;输入命令:ren *.bat *.png 命令行的意思是 把所有bat文件修改成png文件