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

news2024/12/27 13:22:24

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-upload
    v-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-upload
    v-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 就是接口所用的 file
  uploadApi({
    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-upload
      v-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.coloradmin.cn/o/1864915.html

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

相关文章

Java医院绩效考核系统源码 :3分钟带你了解(医院绩效考核系统有哪些应用场景)三级公立医院绩效考核系统源码

Java医院绩效考核系统源码 &#xff1a;3分钟带你了解&#xff08;医院绩效考核系统有哪些应用场景&#xff09;三级公立医院绩效考核系统源码 作为医院用综合绩效核算系统&#xff0c;系统需要和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和…

2024系统分析师考试总结

考试缘由 我自己在毕业不久就考过了中级的软件设计师&#xff0c;这几年换到外企后事情不多&#xff0c;今年初定计划的时候就想着不如考个系统分析师吧。为什么选这个类别呢&#xff1f;按道理我主做程序开发&#xff0c;如果去考系统架构师通过率可能会大一些&#xff0c;但…

深度神经网络(dnn)--风格迁移(简单易懂)

概括 深度神经网络&#xff08;DNN&#xff09;在风格迁移领域的应用&#xff0c;实现了将一幅图像的艺术风格迁移到另一幅图像上的目标。该技术基于深度学习模型&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通过提取内容图像的内容特征和风格图像的…

JAVA应用开发和.net应用开发可以一起学吗?

JAVA应用开发和.NET应用开发同时学习是可行的&#xff0c;但需要记住几个关键点&#xff0c;以确保学习效率和理解深度。刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信…

uniapp横屏移动端卡片缩进轮播图

uniapp横屏移动端卡片缩进轮播图 效果&#xff1a; 代码&#xff1a; <!-- 简单封装轮播图组件:swiperCard --> <template><swiper class"swiper" circular :indicator-dots"true" :autoplay"true" :interval"10000&quo…

JAVA小知识29:IO流(上)

IO流是指在计算机中进行输入和输出操作的一种方式&#xff0c;用于读取和写入数据。IO流主要用于处理数据传输&#xff0c;可以将数据从一个地方传送到另一个地方&#xff0c;例如从内存到硬盘&#xff0c;从网络到内存等。IO流在编程中非常常见&#xff0c;特别是在文件操作和…

Git的安装配置及使用(超详细!!!)

一、git概述 它是一个版本管理工具. 版本: 软件开发过程当中的重要节点. 作用: 团队协作,管理代码. 对于软件的学习, 会用就行. 1.1 安装及配置 下载地址: github.com 安装注意事项: 傻瓜式安装,一直下一步就好. 安装目录不要有中文. 尽量也不要有空格. 配置环境变量: 找到…

1亿参数的细胞大模型来了!登Nature子刊,清华大学团队发布scFoundation:对2万基因同时建模

近年来&#xff0c;大规模预训练模型正在引领新一轮人工智能浪潮。「大模型」通过从大规模、多来源的数据中提取深层次规律&#xff0c;进而能够作为「基础模型」服务不同领域的多样化任务。例如&#xff0c;大语言模型通过学习大量文本数据&#xff0c;掌握了理解和识别语言的…

Python 列表去重方法解析与使用详解

概要 在 Python 编程中,列表是非常常用的数据结构之一。由于在实际使用中,我们经常会遇到包含重复元素的列表,因此对列表进行去重操作是一个常见的需求。本文将详细介绍多种 Python 列表去重的方法,并提供相应的示例代码,帮助更好地掌握这些技术。 使用集合(set) 集合…

充电桩现场安装施工流程

摘要&#xff1a;在化石能源日益紧缩的今天&#xff0c;新能源车辆逐渐走进了千家万户&#xff0c;与传统化石能源车辆相比&#xff0c;以电驱动的新能源车辆能源利用率高&#xff0c;缩短了能源传递过程&#xff0c;实现了能源有效利用。根据能量守恒定律可知&#xff0c;任何…

一文读懂RSTP流媒体传输原理

什么是流&#xff1f; 流&#xff08;Streaming&#xff09;&#xff1a;近年在Internet上出现的新概念&#xff0c;定义非常广泛&#xff0c;主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种&#xff1a;顺序流式传输 (Progressive Streaming)和实时流式传输 (R…

2024挣大钱的机会来了!入职这一行,也能“一飞冲天”

不知不觉我们已经走过了疫情笼罩的三年。如今&#xff0c;已经全面放开&#xff0c;自12月起核酸检测也将彻底取消&#xff0c;对于我们每个人来说这也将是一场长期的战役。 然而在疫情的常态化下&#xff0c;国民经济也将逐渐恢复。对于我们普通人来说如何抓住机遇&#xff…

【渗透测试】小程序反编译

前言 在渗透测试时&#xff0c;除了常规的Web渗透&#xff0c;小程序也是我们需要重点关注的地方&#xff0c;微信小程序反编译后&#xff0c;可以借助微信小程序开发者工具进行调试&#xff0c;搜索敏感关键字&#xff0c;或许能够发现泄露的AccessKey等敏感信息及数据 工具…

模拟题解析:

攻击树方法可以被Red Team用来进行渗透测试&#xff0c;同时也可以被Blue Team用来研究防御机制。攻击树的优点&#xff1a;能够采取专家头脑风暴法&#xff0c;并且将这些意见融合到攻击树之中去&#xff1b;能够进行费效分析或者概率分析&#xff1b;能够建模非常复杂的攻击…

ICRA 2024: 使用Masked Visual-Tactile 对机器人操作预训练

先前的关于机器人操作的预训练工作表明,从大量人类操作数据中学习到的内容, 可以很好地泛化到新的操作任务以及操作环境当中。然而, 先前的方法主要集中在人类视觉或者自然语言方面, 忽视了触觉反馈。在本文中, 作者探索了如何使用人类的视觉和触觉数据来训练机器人操作的预训练…

【启明智显技术分享】MOEDL3芯片通用接口如CAN、I2S、I2C、SPI、UART、USB、emac的介绍和比较

启明智显MODEL3芯片提供的通用接口包括CAN、I2S、I2C、SPI、UART、USB和emac&#xff0c;每种接口都有其独特的功能和应用场景。 以下是这些接口的介绍和比较&#xff1a; CAN接口 功能&#xff1a; 支持CAN2.0A和CAN2.0B协议。支持11位标识符&#xff08;标准格式&#xf…

RT-Thread Studio实现动态线程

1创建项目 我的板子为STM32F03ZET6 点击RT-Thread项目 2选择板子&#xff08;根据自己的板子选择&#xff09; 3找到主函数 4编写代码 4-1创建函数入口 // 线程入口函数 static void thread_entry(void *parameter) {rt_uint32_t count 0;while (1){// 线程执行的代码rt_k…

windows下以服务方式安装prometheus和grafana

grafana 找到confi下的defaults.ini&#xff0c;找到http_port修改端口号 # The HTTP port to use http_port 3000启动 grafana-server.exe访问localhost:8601即可 下载winsw https://github.com/winsw/winsw 新建grafanaservice.xml <service><id>grafana&…

(四十六)Vue Router组件所独有的两个钩子activate、deactivated

文章目录 activated钩子函数deactivated钩子函数demo 上一篇&#xff1a;&#xff08;四十五&#xff09;Vue Router之编程式路由导航 Vue Router提供了两个钩子函数&#xff0c;分别是activated和deactivated。 这两个钩子函数可以用于在路由组件的激活状态发生变化时执行相…

远程过程调用协议gRPC及在go环境下的使用

1. 远程过程调用协议 1.1 定义 远程过程调用(Remote Procedure Call&#xff0c;PRC是一种进程间通信技术&#xff0c;它使得程序可以像调用本地函数一样调用远程服务器上的函数。RPC 屏蔽了底层的通信细节&#xff0c;让开发者能够更专注于业务逻辑&#xff0c;而无需关心网络…