Ant Design Vue Upload 自定义上传 customRequest,这一篇很详细

Upload 常用属性和方法

在这里插入图片描述

示例上传接口

# 接口文档
url `https://www.mocky.io/api/main/upload`
头部
x-token: 'xxx'  
参数
file: File   // 上传的文件
flag: 'xxx'  // 上传的标识
// 文件上传 api 函数简单封装
export const uploadApi = ({ file }) => {const formData = new FormData();formData.append('file', file);// ... 略,formData 其他实现逻辑return axios({url: '/api/upload',method: 'POST',data: formData,headers: {'Content-type': 'multipart/form-data',},});
};

组件基本使用

<a-uploadv-model:file-list="fileList"name="file":multiple="true"action="https://www.mocky.io/api/main/upload":headers="{ x-token: 'xxx' }":data="{ flag: 'xxx' }"@change="handleChange"><a-button>点击上传</a-button>
</a-upload>

基本使用方式可以满足大部分上传需求,但是也存在局限性,仅限于配合该组件的属性使用。如果是已经封装好了上传的请求函数(包括头部信息和请求中间件等),可在多个地方使用,还使用该方式拼接 data,headers 就有点冗余了。

customRequest 自定义上传

简单使用

使用组件的 customRequest 属性覆盖默认的上传行为,可以自定义自己的上传实现

<a-uploadv-model:file-list="fileList"list-type="picture-card"name="file":multiple="true":customRequest="customUpload"@change="handleChange"
><upload-outlined></upload-outlined>
</a-upload><script>
...
const fileList = ref([]);// 自定义文件上传公共函数
// e - 上传组件返回的上传实例,里面包括 file,和一些组件方法
// e.file - 上传的文件实例对象
// e.onSuccess(ret, xhr)
// e.onError(err, ret)
const customUpload = (e) => {console.log(e);// uploadApi 你的二次封装上传接口  uploadApi({file: e.file}).then((res) => {console.log('上传成功', res.data);// 调用实例的成功方法通知组件该文件上传成功e.onSuccess(res.data, e);  }).catch((err) => {// 调用实例的失败方法通知组件该文件上传失败e.onError(err);});
};</script>

这样的话,实现自定义的上传函数,二次封装上传接口,例如在uploadApi使用 axios 对基本路径、头部信息和请求参数的封装。

在请求成功后调用组件实例成功回调onSuccess(ret,xhr),回传的ret 将会存放在fileList 中的 file.response 中,可运用这点存放所需的数据。

进度条的实现

由于前面 简单使用 的时候我们自定义了上传逻辑,组件未能监听到上传的进度 fileList 中的 file.percent 会一直处于 0 的状态。所以下面我们实现一下请求进度逻辑,补全该进度条。

// 自定义文件上传公共函数
// e.onProgress(event)  event的格式为 {percent:xxx}
const customUpload = (e) => {console.log(e);// 上传接口  e.file 就是接口所用的 fileuploadApi({file: e.file,onUploadProgress: (ev) => {// ev - axios 上传进度实例,上传过程触发多次// ev.loaded 当前已上传内容的大小,ev.total - 本次上传请求内容总大小console.log(ev);const percent = (ev.loaded / ev.total) * 100;// 计算出上传进度,调用组件进度条方法e.onProgress({ percent });},}).then((res) => {console.log('上传成功', res.data);e.onSuccess(res.data, e);}).catch((err) => {e.onError(err);});
};

看上去也就多了个onUploadProgress参数。不过这个参数并非只是 uploadApi 方法的。还需要在请求实例(axios)中配置该上传进度回调参数。

// 文件上传 api
export const uploadApi = ({ file, onUploadProgress }) => {const formData = new FormData();formData.append('file', file);// ... 略,formData 其他实现逻辑return axios({url: '/api/upload',method: 'POST',data: formData,headers: {'Content-type': 'multipart/form-data',},onUploadProgress, // 上传进度回调函数 onUploadProgress(ev)});
};

实现了上传进度逻辑,自定义上传的文件列表 fileList 中的 file.percent 才会正确反应进度情况

配合表单组件使用

以 Vue3 的概念逻辑代码为例

<a-form :model="formInfo"><a-form-item label="your name"><a-input v-model:value="formInfo.name" /></a-form-item><a-form-item label="身份证上传"><a-uploadv-model:file-list="fileList"list-type="picture-card"name="file":multiple="true":customRequest="customUpload"@change="handleChange"><upload-outlined></upload-outlined></a-upload></a-form-item><a-form-item :wrapper-col="{ span: 14, offset: 4 }"><a-button type="primary" @click="onSubmit">Submit</a-button><a-button style="margin-left: 10px">Cancel</a-button></a-form-item>
</a-form><script>
...const fileList = ref([]);
const formInfo = reactive({name: '阿姣🐷',
});// 获取上传成功的文件 url 数组
const getSuccessFileUrls = (list) => {let urls = [];list.forEach((item) => {// 获取上传成功的文件数据if (item.status === 'done' && item.response) {urls.push(item.response.url); //改为你想获取的数据格式}});return urls;
};// 表单提交
const onSubmit = () => {const urls = getSuccessFileIds(fileList.value);console.log(urls);console.log(toRaw(formInfo));...submitInfoApi(data).then(res=>{}).cathc(err=>{})
};
</script>

获取详情后回显表单

请求信息详情接口成功后,将图片文件等url重新按照 fileList 的格式赋值文件列表。

<script>
const fileList = ref([]);const fetchDetail = ()=>{getInfoDetail(data).then(res=>{let imageUrls = res.data.images; // 详情数据 imageUrls.forEach(item=>{let newItem = {uid: 'xxxx1',response: {id: 'xxxx1',origin_name: 'image1.png',url: 'http://xxx/image1.png',},name: 'image1.png',status: 'done',url: 'http://xxx/image1.png',};fileList.value.push(newItem); // 赋值文件列表});...});
}
</script>

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

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

相关文章

Markdown的使用

这里写自定义目录标题 欢迎使用Markdown新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注…

iOS之如何创建.framework静态库

番外&#xff1a;想要查看如何创建.a静态库可前往看我iOS之如何创建.a静态库-CSDN博客这篇文章。 一、创建framework项目 创建framework工程要选择iOS --> Cocoa Touch Framework输入项目名称PrintFramework也是编译生成的framework的名称。framework的名称也可以以后在项目…

CID引流电商:传统电商破局的新动力

摘要&#xff1a;CID引流电商为传统电商带来破局新机遇&#xff0c;通过跨平台引流、精准定位和高效转化&#xff0c;解决了流量获取难、成本高的问题&#xff0c;提升了销售业绩和市场竞争力。CID引流电商助力传统电商在激烈竞争中保持领先&#xff0c;推动行业持续发展。 随…

WEB攻防【5】——JS项目/Node.js框架安全/识别审计/验证绕过

1、test.php和test.html对比 #知识点&#xff1a; 1、原生JS&开发框架-安全条件 2、常见安全问题-前端验证&未授权 #详细点: 1、什么是Js渗透测试? 在Javascript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可参数漏洞 JS开发的WEB应用和PHP、java.NET…

学习笔记——动态路由——RIP(RIP路由汇总介绍)

四、RIP路由汇总介绍 当网络中路由器的路由条目非常多时&#xff0c;可以通过路由汇总&#xff08;又称路由汇聚或路由聚合&#xff09;来减少路由条目数&#xff0c;加快路由收敛时间和增强网络稳定性。 路由汇总的原理是&#xff0c;同一个自然网段内的不同子网的路由在向外…

recogito-js:用于文本注释/图像注释的前端插件

创建批注&#xff1a; 继续批注&#xff1a; 右侧批注列表&#xff1a; 1、功能与应用&#xff1a; 文本注释&#xff1a;recogito-js可以将注释功能添加到网页上&#xff0c;或者作为构建完全自定义注释应用程序的工具箱。图像注释&#xff1a;除了文本注释外&#xff0c;它还…

WITS核心价值观【创新】篇|从财务中来,到业务中去

「客尊」、「诚信」、「创新」 与「卓越」 是纬创软件的核心价值观。我们秉持诚信态度&#xff0c;致力于成为客户长期且值得信赖的合作伙伴。持续提升服务厚度&#xff0c;透过数字创新实践多市场的跨境交付&#xff0c;助客户保持市场领先地位。以追求卓越的不懈精神&#xf…

腾讯云点播VOD(sprintboot后端+vue前端)

1. 腾讯云点播 官网文档入口: 云点播简介_云点播购买指南_云点播操作指南-腾讯云 2. 业务需求 2.1.上传视频 2.2.浏览视频 2.3.删除视频 3. 腾讯云提供服务器上传和客户端上传。我使用springboot后端实现客户端上传视频。 3.1 后端要求 生成签名,前端拿着签名凭证,才能上…

easyui的topjui前端框架使用指南

博主今天也是第一次点开easyui的商业搜权页面&#xff0c;之前虽然一直在使用easyui前端框架&#xff08;easyui是我最喜欢的前端ui框架&#xff09;&#xff0c;但是都是使用的免费版。 然后就发现了easyui的开发公司居然基于easyui开发出了一个新的前端框架&#xff0c;于是我…

AppFlow无代码轻松搭建模型Agent

随着大语言模型发展至今&#xff0c;如何深度开发和使用模型也有了各种各样的答案&#xff0c;在这些答案当中&#xff0c;Agent无疑是一个热点回答。 通过模型也各种插件的组合&#xff0c;可以让你的模型应用具备各种能力&#xff0c;例如&#xff0c;通过天气查询插件机票查…

解决卸载TabX explorer软件后导致系统文件资源管理器无法正常使用问题

最近安装了最新版本的鲁大师&#xff0c;安装过程中不小心同时安装了捆绑软件TabX explorer。这个软件和系统自带的文件资源管理器很像&#xff0c;最后弹出会员到期才发现&#xff0c;这个不是系统文件资源管理器&#xff0c;是第三方的文件资源管理器&#xff0c;就按正常流程…

服务器机柜和网络机柜有什么区别

服务器机柜和网络机柜虽然在外观上可能相似&#xff0c;都遵循19英寸的标准&#xff0c;但它们的设计目的、功能、结构和特性存在明显的区别。下面是两者的主要区别&#xff1a; 1. 用途 服务器机柜&#xff1a;主要用于承载和组织服务器设备&#xff0c;包括主机、存储设备、交…

智能化物业服务:楼层动态一目了然

通过图扑先进的可视化技术&#xff0c;实现对物业楼层的实时监控与高效管理。全面掌握楼层动态&#xff0c;优化资源配置&#xff0c;提升响应速度和服务质量&#xff0c;为业主提供智能化、便捷化的物业管理体验。

智慧校园-就业管理系统总体概述

在当代教育与信息技术深度融合的背景下&#xff0c;智慧校园就业管理系统成为了连接学生、高校与企业的重要纽带&#xff0c;它以创新的服务理念和技术手段&#xff0c;重塑了职业规划与就业服务的传统模式。这一系统致力于为即将步入社会的学生们提供全面、个性化的支持&#…

酒店民宿预订小程序:高效管理,便捷入住

目前&#xff0c;我国旅游业发展非常旺盛&#xff0c;同时也带动了酒店民宿的快速发展。随着互联网科技的快速发展&#xff0c;酒店民宿小程序层出不穷。一个高效的小程序目前已经成为了各大服务业中必不可少的环节&#xff0c;对于酒店民宿商家来说&#xff0c;线上小程序不仅…

2024年6月大众点评广州餐饮店铺POI分析20万家

2024年6月大众点评广州餐饮店铺POI共有199175家 店铺POI点位示例&#xff1a; 店铺id k9uiFADtAvs9EdPC 店铺名称 点都德(聚福楼店) 十分制服务评分 8.6 十分制环境评分 8.3 十分制划算评分 8.5 人均价格 77 评价数量 41673 店铺地址 惠福东路470号(富临食府对面) 大…

2024年6月17日~2024年6月26日周报

一、前言 在上周主要完成了可变形卷积的学习的部署。 本周&#xff0c;结合前段时间的工作与闵老师的讨论&#xff0c;思考了接下来的一些尝试方向。本周重新在之前的网络上尝试添加可变形卷积v4&#xff0c;或者将可变形卷积v2修改为可变形卷积v4。另外&#xff0c;继续学习了…

入职必备-Git安装(为什么Git安装包无法直接安装)

1.首先下载Mac Git应用&#xff0c;打开Git官网https://git-scm.com/download&#xff0c;执行以下操作&#xff08;见下图一和下图二&#xff09;&#xff0c;然后会打开页面&#xff08;见下图三&#xff09;&#xff0c;向上滑动一下会见到页面&#xff08;见下图四&#xf…

逆变器使用手册:类型详解、安装要点与维护须知

逆变器随着可再生能源的兴起和移动电源需求的激增已成为连接直流电与交流电世界的桥梁&#xff0c;其重要性不言而喻。无论是太阳能发电系统的高效利用&#xff0c;还是汽车、游艇等移动设备的电力供应&#xff0c;逆变器都扮演着关键角色。然而&#xff0c;正确的使用方法是确…

ELK日志集成

https://www.bilibili.com/video/BV1x94y1674x/?buvidXY705117E90F73A790429C9CFBD5F70F22168&vd_source939ea718db29535a3847d861e5fe37ef