vue+springboot的文件上传处理

目录

1.前端:

2.说明


1.示例:

使用前端框架中的上传组件,例如element plus及arco design,要使用自定义的上传属性或者change属性,获取上传的文件信息。

<template><a-drawer :width="600" :visible="drawerVisible" @ok="handleOk" :ok-loading="okLoading" @cancel="handleCancel"unmountOnClose><template #title><span> {{ title }} </span></template><a-form ref="formRef" :model="insertForm" :label-col-props="{ span: 6 }" :wrapper-col-props="{ span: 18 }"label-align="left"><a-row :gutter="20"><a-col :span="20"><a-form-item field="releaseTime" label="发行时间":rules="[{required: true,message: '发行时间不能为空'}]":validate-trigger="['change', 'blur']"><a-date-pickerv-model="insertForm.releaseTime"style="width: 165px;"show-timeformat="YYYY-MM-DD HH:mm"/></a-form-item></a-col></a-row><a-row :gutter="20"><a-col :span="20"><a-form-item field="forceType" label="是否强制"><a-radio-group :default-value="0"v-model="insertForm.forceType":options="[{ label: '否', value: 0},{ label: '是', value: 1 }]"/></a-form-item></a-col></a-row><a-row :gutter="20"><a-col :span="20"><a-form-item field="content" label="更新内容" :rules="[{required: true,message: '更新内容不能为空'},{maxLength:100,message:'内容不能超过100位'},{validator: (value, cb) => {if (!value.trim()) {cb('更新内容不能为空')} else {cb()}}}]":validate-trigger="['change', 'blur']" ><a-textarea v-model="insertForm.content" placeholder="请填写更新内容"/></a-form-item></a-col></a-row><a-row :gutter="20"><a-col :span="20"><a-form-item field="file" label="附件信息"><a-uploaddraggableaccept=".apk":limit="1":custom-request="customRequest":default-file-list="fileList":show-remove-button="!isUpdate"/></a-form-item></a-col></a-row></a-form></a-drawer>
</template><script lang="ts" setup>
import {ref} from "vue";
import {FormInstance} from '@arco-design/web-vue/es/form';
import {Message} from '@arco-design/web-vue';
import {update, upload, VersionData} from "@/api/appVer";
import {getResult} from "@/utils/api";
import moment from "moment";// 表单对象
const formRef = ref<FormInstance>();
// 触发更新时间
const emits = defineEmits(['handleQuery']);
// 弹窗对象
const drawerVisible = ref(false);
// 表单数据对象
let insertForm = ref<VersionData>({forceType: 0, versionCode: 1});
// 框展示类型
let title = ref();
// 文件信息
const fileList = ref([] as any)
// 是否是更新的标识
let isUpdate = ref(false);
// 定义文件对象
let fileItem: any = {uid: "0"};
// 确定键loading
const okLoading = ref(false);// 打开弹窗
const openDialog = async (row: any, type: any) => {if (type == "2") {insertForm.value = row;title.value = "修改";isUpdate.value = true;// 设置文件信息fileItem = {uid: row.id,name: row.appName,url: row.appPath,};// 设置文件列表fileList.value = [fileItem];} else {title.value = "新增";insertForm.value = {forceType: 0, versionCode: 1}isUpdate.value = false;fileList.value = [];}drawerVisible.value = true;
};// 导出方法在父组件中进行使用
defineExpose({openDialog});// 表单提交
const handleOk = async () => {okLoading.value = true;const validRes = await formRef.value?.validate();// 校验失败直接返回if (validRes) {okLoading.value = false;return;}// 附件必填if (!fileItem.name) {Message.error({content: '附件信息不能为空', position: 'top'})okLoading.value = false;return;}const formData = new FormData();formData.append('file', fileItem.file);formData.append("data", JSON.stringify(insertForm.value))// 调用新增接口let result;// 更新try {if (isUpdate.value) {result = await update({reqBody: {...insertForm.value,idCondition: insertForm.value.id,releaseTime: moment(insertForm.value.releaseTime)},reqHdr: null});} else {result = await upload(formData);}getResult(result);} catch (e) {return;} finally {okLoading.value = false;}// 重置表单formRef.value?.resetFields()drawerVisible.value = false;// 调用父组件方法进行画面刷新emits('handleQuery');
};// 取消
const handleCancel = () => {// 重置表单formRef.value?.resetFields()drawerVisible.value = false;
}// 上传文件
const customRequest = (option: any) => {const {onSuccess} = optionfileItem = option.fileItemonSuccess();
}
</script>

示例说明:

画面中的表单存在可输入的信息以及要上传附件。上传组件如下:

            <a-uploaddraggableaccept=".apk":limit="1":custom-request="customRequest":default-file-list="fileList":show-remove-button="!isUpdate"/>

开启了拖拽上传,设置了可以上传的格式为apk格式,设置了上传文件个数最多上传一个,设置了自定义的上传方法,上传后触发此方法,设置了默认的文件列表,用于修改时进行显示,设置了是否有文件删除按钮,修改时附件信息不可修改。

上传之后,触发了自定义的上传方法,如下:

// 上传文件
const customRequest = (option: any) => {const {onSuccess} = optionfileItem = option.fileItemonSuccess();
}

存储了上传文件的信息,并且执行了上传成功的方法,在画面上会显示上传成功的标志,这是为了让画面显示的更好看,否则会显示上传中的标志,对用户有误导。

点击确定按钮,调用后端的接口,进行文件的上传及信息的存储。如下:

// 表单提交
const handleOk = async () => {okLoading.value = true;const validRes = await formRef.value?.validate();// 校验失败直接返回if (validRes) {okLoading.value = false;return;}// 附件必填if (!fileItem.name) {Message.error({content: '附件信息不能为空', position: 'top'})okLoading.value = false;return;}const formData = new FormData();formData.append('file', fileItem.file);formData.append("data", JSON.stringify(insertForm.value))// 调用新增接口let result;// 更新try {if (isUpdate.value) {result = await update({reqBody: {...insertForm.value,idCondition: insertForm.value.id,releaseTime: moment(insertForm.value.releaseTime)},reqHdr: null});} else {result = await upload(formData);}getResult(result);} catch (e) {return;} finally {okLoading.value = false;}// 重置表单formRef.value?.resetFields()drawerVisible.value = false;// 调用父组件方法进行画面刷新emits('handleQuery');
};

首先进行了表单校验及附件信息的校验。

因为要上传文件,所以使用formData,创建formData对象,存储文件对象及表单对象的字符串。新增时直接调用upload方法,进行上传,使用post方式。api文件中的内容如下:

// 上传数据
export async function upload(params: any): Promise<any> {return axios.post<ResponseData>("/xxxx/file/uploadInfo", params);
}

后端:

package com.kingagroot.info.tianjiannongshi.mvc.controller.file;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kingagroot.info.common.annotation.log.SysLog;
import com.kingagroot.info.common.domains.standard.netformat.ResponseBean;
import com.kingagroot.info.common.domains.standard.netformat.RtnBean;
import com.kingagroot.info.common.domains.standard.rescodeformat.ResMsg;
import com.kingagroot.info.tianjiannongshi.mvc.persistent.entity.master.base.AppVersionEntity;
import com.kingagroot.info.tianjiannongshi.mvc.service.master.customize.file.SftpService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;import javax.servlet.http.HttpServletRequest;/*** 文件上传控制层API入口** @author Lison 2023/12/11*/
@Api(value = "/xxxx/file", tags = {"文件上传的控制层API入口"})
@RestController
@RequestMapping("/xxxx/file")
public class SftpController {@Autowiredprivate SftpService sftpService;@SysLog@ApiOperation(value = "上传app文件数据接口")@PostMapping(value = "/uploadInfo")public ResponseBean mb1002(@RequestParam("file") MultipartFile file, @RequestParam(value = "data") String data) {RtnBean rtnBean = sftpService.appUpload(file, JSON.parseObject(data,AppVersionEntity.class));if(rtnBean.getRsl()) {return new ResponseBean("uploadInfo", ResMsg.SUCCESS.getRetCode(), ResMsg.SUCCESS.getRetMsg(), rtnBean.getRtnObj());}else {return new ResponseBean("uploadInfo", rtnBean.getResMsg().getRetCode(),  rtnBean.getResMsg().getRetMsg(), null);}}}

后端使用RequestParam进行参数接口,参数名和前端中formData中的key执行,接收到的表单数据可以使用JSON转换为具体的实体类进行使用。

2.说明

①上传时,请求头中的content-type为multipart/form-data格式的。

②使用formData存储表单中的数据以及文件数据,并作为参数传给后端。

FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式。主要是用来上传文件。

// 使用append来添加键/值对到表单里面
formData.append('username', 'yang');
// 使用get方法获取key对应的值
formData.get('username');
// 使用delete方法删除键/值对
formData.delete('username');
// 使用set方法,当key存在时,进行更新;key不存在时,进行添加
formData.set('username', 'Chris');
// 使用has方法判断是否存在key
formData.has('username');
//使用entries方法返回一个 iterator对象 ,此对象可以遍历访问FormData中的键值对
var i = formData.entries();
for(var pair of formData.entries()) {console.log(pair[0]+ ', '+ pair[1]);
}
// FormData.keys() 该方法返回一个迭代器(iterator),遍历了该 formData 包含的所有key
for (var key of formData.keys()) {console.log(key);// FormData.values() 方法返回一个允许遍历该对象中所有值的 迭代器 。这些值是 USVString 或是Blob 对象。
for (var value of formData.values()) {console.log(value);
}

③后端可以使用requestParam注解进行文件及表单数据的接收,接收表单数据要使用String类型接收,然后再通过JSON工具类转换成具体的实体对象进行使用。 当然,后端也可以使用requestPart进行接收。直接将requestParam换成requestPart即可,表单数据还是使用String类型进行接收。

查看其他资料,后端的表单数据也可以用实体类进行接收,按照下面的方法试了一下,报400的错误,没有实现。

https://blog.csdn.net/qq_38076935/article/details/123008493

@RequestParam和@RequestPart的区别-CSDN博客

SpringBoot @RequestPart 同时接收文件和复杂json数据_requestpart同时接收附件和对象-CSDN博客

④注意使用不同组件时,获取上传文件的方式。

⑤修改时,文件列表的回显可以使用组件的默认值类似的属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四款坚固耐用、小尺寸、1EDB9275F、1EDS5663H、1EDN9550B、1EDN7512G单通道栅极驱动器IC

1、1EDB9275F 采用DSO-8 150mil封装的单通道隔离栅极驱动器&#xff08;PG-DSO-8&#xff09; EiceDRIVER™ 1EDB 产品系列 单通道栅极驱动器IC具有3 kVrms的输入输出隔离电压额定值。 栅极驱动器系列具有6/-4 ns传输延迟精度&#xff0c;可针对具有高系统级效率的快速开关应…

vue 前端加密解密 CryptoJS

$ npm install crypto-js 安装cryptojs 安装方法 实际使用情况: import CryptoJS from "crypto-js"; //let decrypted CryptoJS.lib.SerializableCipher.decrypt( // CryptoJS.algo.AES, // data.tuituiMobileCrypt, // …

libcurl是一个用于进行网络通信的开源库,提供了各种功能和选项,可以用于发送和接收HTTP请求、FTP操作等

libcurl libcurl是一个用于进行网络通信的开源库&#xff0c;提供了各种功能和选项&#xff0c;可以用于发送和接收HTTP请求、FTP操作、SMTP邮件等。它支持多种协议&#xff0c;包括HTTP、HTTPS、FTP、FTPS、SMTP、POP3、IMAP等。 以下是libcurl库的一些特点和功能&#xff1…

Python 内置数据类型详解

内置数据类型 在编程中&#xff0c;数据类型是一个重要的概念。 变量可以存储不同类型的数据&#xff0c;不同类型可以执行不同的操作。 Python默认内置了以下这些数据类型&#xff0c;分为以下几类&#xff1a; 文本类型&#xff1a;str 数值类型&#xff1a;int、float、…

宠物空气净化器真的有用吗?五款猫用宠物空气净化器测评!

作为一个养猫四年的铲屎官&#xff0c;我不得不说&#xff0c;宠物空气净化器是21世纪养猫人最伟大的神器之一&#xff01; 当我刚开始养猫的时候&#xff0c;我并没有意识到猫毛会成为一个如此头疼的问题。虽然朋友们告诉我要做好心理准备&#xff0c;但我并没有想到家里的猫毛…

最新版git2.43安装、记住用户名和密码以及tortoisegit2.15使用

一、下载git 打开git官网地址&#xff1a;https://git-scm.com/进行下载 下载完安装&#xff0c;一直next就好&#xff0c;如果愿意就可以改下安装路径&#xff0c;改在d盘。 具体可以参考&#xff1a;git安装教程 二、安装完下载小乌龟以及中文语言包 下载地址&#xff1a;…

长期戴耳机的危害有哪些?戴哪种耳机不伤耳朵听力?

长期佩戴耳机可能会出现听力下降、耳道感染等危害。 听力下降&#xff1a;长时间戴耳机可能会导致耳道内的声音过大&#xff0c;容易对耳膜造成一定的刺激&#xff0c;容易出现听力下降的情况。 耳道感染&#xff1a;长时间戴耳机&#xff0c;耳道长期处于封闭潮湿的情况下&a…

Node+Express编写接口---服务端

开始&#xff1a; 个人兴趣爱好&#xff0c;欢迎大家多多指教&#xff01;(点击直达源码!) node_vue_admin: 第一个以node为后端,vue为前端的后台管理项目https://gitee.com/ah-ah-bao/node_vue_admin.git 第一步:安装 安装Node.js 点击直达Node.js (nodejs.org) 安装Navic…

Vue 2生命周期已达终点,正式结束使命

Vue.js是一款流行的JavaScript框架&#xff0c;拥有广泛的应用和开发者社区。自Vue.js 2发布以来&#xff0c;它在前端开发中扮演了重要角色&#xff0c;并且被广泛采用。然而&#xff0c;技术的发展是无法阻挡的&#xff0c;随着2024年的到来&#xff0c;Vue 2的生命周期也走到…

011:vue结合css动画animation实现下雪效果

文章目录 1. 实现效果2. 编写一个下雪效果组件 VabSnow.vue3. 页面使用4. 注意点 1. 实现效果 GIF录屏文件太卡有点卡&#xff0c;实际是很丝滑的 2. 编写一个下雪效果组件 VabSnow.vue 在 src 下新建 components 文件&#xff0c;创建VabSnow.vue组件文件 <template>…

React16源码: React中的FunctionComponent的源码实现

Function Component 1 &#xff09;概述 FunctionComponent 是引出调和子节点的过程调和子节点是一个统一的过程&#xff0c;和各类组件不同类型没有太大关系 在 ReactDOM.render 第一次时&#xff0c;只有一个Fiber对象这个Fiber对象它会保存它的props, 里面有很多的childre…

【网络安全知识】5种较流行的网络安全框架及特点分析

网络安全框架主要包括安全控制框架&#xff08;SCF&#xff09;、安全管理框架&#xff08;SMP&#xff09;和安全治理框架&#xff08;SGF&#xff09;等类型。 对于那些希望按照行业最佳实践来开展网络安全能力建设的企业来说&#xff0c;理解并实施强大的网络安全框架至关重…

雍禾植发为地球种下发际线,雍禾医疗以公益名义为消费者种下希望

“绿水青山才是金山银山”&#xff0c;绿色现已成为新时代中国的鲜明底色。天更蓝&#xff0c;水更清&#xff0c;人与环境和谐发展已深入人心。位于内蒙古自治区阿拉善盟西部的额济纳旗常年干旱少雨&#xff0c;风沙肆虐&#xff0c;这里亟需被植上一片森林&#xff0c;为地球…

使用Spring管理Caffeine缓存(CacheManager+Caffeine)

1 依赖 使用Spring管理Caffeine缓存的主要pom依赖如下所示。 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version> </dependency><dependency…

介绍 sCrypt:BTC 的 Layer-1 智能合约框架

在 TypeScript 中开发 BTC 智能合约 我们非常高兴地推出 sCrypt&#xff1a;一种现代 Typescript 框架&#xff0c;用于在 BTC 上开发第一层智能合约&#xff0c;无需分叉。 现在&#xff0c;人们可以使用现代开发工具在易于使用的统一框架中编写、测试、调试、部署和调用智能合…

Microsoft Word 删除空行

Microsoft Word 删除空行 1. 删除空行1.1. 替换1.2. 段落标记 References 1. 删除空行 1.1. 替换 1.2. 段落标记 特殊格式 -> 段落标记 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

DQN、Double DQN、Dueling DQN、Per DQN、NoisyDQN 学习笔记

文章目录 DQN (Deep Q-Network)说明伪代码应用范围 Double DQN说明伪代码应用范围 Dueling DQN实现原理应用范围伪代码 Per DQN (Prioritized Experience Replay DQN)应用范围伪代码 NoisyDQN伪代码应用范围 部分内容与图片摘自&#xff1a;JoyRL 、 EasyRL DQN (Deep Q-Networ…

RAM读写测试

真双口RAM读写测试 IP核设置如下 注意点是&#xff1a; 1、wea信号位宽由于选择了32bit地址&#xff0c;导致使能了按字节写入&#xff0c;因此wea每一位对应一个8bit的din&#xff0c;高有效&#xff1b; 2、rsta 信号指RAM复位置位信号&#xff0c;高有效&#xff0c;但是…

Altium Designer简介以及下载安装

阅读引言&#xff1a; Altium Designer的离线安装包在文章最后&#xff0c; 注意该软件只能用于个人的学习使用&#xff0c; 不能用于商业用途&#xff0c; 文章主题图片来自网络。 一、Altium Designer简介 Altium Designer是一款功能强大的电子设计自动化&#xff08;EDA&…

【GAMES101】Lecture 07 着色(shading)

目录 着色 Blinn-Phong反射模型 漫反射 光衰减 着色 这个着色&#xff08;shading&#xff09;就是将不同的材质应用到不同的物体上&#xff0c;像一个物体&#xff0c;它可以是木头的、金属的、塑料的…… Blinn-Phong反射模型 我们来看一个简单的着色模型&#xff0c;…