antd upload组件beforeUpload返回promise之后,获取的文件不是file类型导致上传失败

之前的beforeUpload直接返回一个false值 ,文件是可以正常与服务端进行传输的


  beforeUpload: (file) => {
       return false
    },

在这里插入图片描述

但是这样并不能阻止文件上传,看了官方文档后,改用返回promise对象上传

 beforeUpload: (file) => {
      console.log('-beforeUploadfile========', file)
      return new Promise(async (resolve, reject) => {
        importExcel(file).then(res => {
          let list = res[0].data // 去除表头
          list.splice(0, 1)
          list.splice(list.length - 1, 1)
          let reslist = _.cloneDeep(list)
          reslist.forEach((item, index) => {
            // 如果数据中有空字段,删除此条数据
            item.forEach(eItem => {
              if (!eItem.cont) { // 如果三项中一其值为空即删除
                // reslist.splice(index, 1)
                result = false
              }

            })
          })
          // 如果数据已有此条数据,删除此条数据
          let arr = changeplan.permatmac.person;
          arr.forEach((item) => {
            for (let i = reslist.length - 1; i >= 0; i--) {
              const ele = reslist[i]
              if (item.name === ele[0].cont) {
                // reslist.splice(i, 1);
                result = false

              }
            }
          })

          if (!result) {
            message.warning('导入文件不合法!可能包含空白字段与重复数据!')
            return false
          }
          resolve();
          return true;
        })

      })
      // return false
    },

我们发现 ,现在可以阻止上传了,但是传给服务端的文件不是二进制的,而变成了一个object,所以报错了

在这里插入图片描述
在这里插入图片描述

然后尝试把这个object转换成二进制流,发现依然报错

      let formData = toformdata({
        file: new Blob([JSON.stringify(fileList[0])])
      });

在这里插入图片描述

再后来又仔细阅读了文档 ,发现了这段,于是尝试在resolve时把对象返回去,依然报错……


resolve(file)

在这里插入图片描述

再看到最后,一开始没理解 这个originFileObj是啥,打印了一下info.file.originFileObj,发现这就是我们想要的那个file文件
在这里插入图片描述

    onChange: (file) => {
      console.log('onChange-file', file)
      // console.log('file.file.originFileObj', file.file.originFileObj)
      setfileList([file.file]); // 这是beforeUpload返回false值时所用到的赋值
      console.log('onchenage', fileList)
    },

所以我们直接把info.file.originFileObj赋值给filelist就好了……

    onChange: (file) => {
      console.log('onChange-file', file)
      console.log('file.file.originFileObj', file.file.originFileObj)
      setfileList([file.file.originFileObj]);
      console.log('onchenage', fileList)
    },

真无语,一个版本问题,解决了一上午,尝试各种办法,结果人家文档里写了……

贴一下完整代码吧哈哈哈哈

const uploadprops = {
    multiple: false,
    accept: '.xlsx',
    onChange: (file) => {
      console.log('onChange-file', file)
      console.log('file.file.originFileObj', file.file.originFileObj)
      setfileList([file.file.originFileObj]);
      console.log('onchenage', fileList)
    },
    onRemove: (file) => {
      const index = fileList.indexOf(file);
      const newFileList = fileList.slice();
      newFileList.splice(index, 1);
      setfileList(newFileList);
    },

    beforeUpload: (file) => {
      console.log('-beforeUploadfile========', file)
      return new Promise(async (resolve, reject) => {
        importExcel(file).then(res => {
          let list = res[0].data // 去除表头
          list.splice(0, 1)
          list.splice(list.length - 1, 1)
          let reslist = _.cloneDeep(list)
          reslist.forEach((item, index) => {
            // 如果数据中有空字段,删除此条数据
            item.forEach(eItem => {
              if (!eItem.cont) { // 如果三项中一其值为空即删除
                // reslist.splice(index, 1)
                result = false
              }

            })
          })
          // 如果数据已有此条数据,删除此条数据
          let arr = changeplan.permatmac.person;
          arr.forEach((item) => {
            for (let i = reslist.length - 1; i >= 0; i--) {
              const ele = reslist[i]
              if (item.name === ele[0].cont) {
                // reslist.splice(i, 1);
                result = false

              }
            }
          })

          if (!result) {
            message.warning('导入文件不合法!可能包含空白字段与重复数据!')
            return false
          }
          resolve();
          return true;
        })

      })
      // return false
    },
    fileList,
  }; // 上传组件的配置参数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生:先进技术与未来发展的洞察

数字孪生:先进技术与未来发展的洞察 随着数字技术的迅猛发展,数字孪生作为新兴的概念和技术应运而生。数字孪生能够将现实世界与虚拟世界紧密连接,通过实时监测、数据分析和模拟仿真,为企业提供优化运营、提高效率和质量的解决方案…

算法:模拟思想算法

文章目录 实现原理算法思路典型例题替换所有问号提莫攻击N字型变换外观序列 总结 本篇总结的是模拟算法 实现原理 模拟算法的实现原理很简单,就是依据题意实现题意的目的即可,考察的是你能不能实现题目题意的代码能力 算法思路 没有很明显的算法思路…

高阶数据结构并查集

目录: 并查集的概念代码实现 LeetCode例题 并查集的概念 将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中反复遇到查询某一个元素属于那个集合的运算…

一文讲透 JavaScript 应用的演进历程

在不断发展的软件开发领域中,很少有编程语言像JavaScript一样产生深远的影响。它起初只是一种简单的脚本语言,但如今已成为现代Web的驱动力量,改变了应用构建和体验的方式。本文将带你沿着时间线,穿越JavaScript的演进历程&#x…

新亮点!安防视频监控/视频集中存储/云存储平台EasyCVR平台六分屏功能展示

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

简单shell脚本的编写

文章目录 简单使用shell脚本参数判断整数的比较运算符字符串的比较运算shell脚本流程控制shell脚本循环for循环批量添加用户批量ping IP地址检测同一局域网,多台主机存活情况检测同一局域网,多台主机存活情况多线程检测主机存活情况 while循环case选择语…

TCP--半连接队列和全连接队列

原文地址:https://plantegg.github.io/2020/04/07/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82TCP–%E5%8D%8A%E8%BF%9E%E6%8E%A5%E9%98%9F%E5%88%97%E5%92%8C%E5%85%A8%E8%BF%9E%E6%8E%A5%E9%98%9F%E5%88%97–%E9%98%BF%E9%87%8C%E6%8A%80%E6%9C%AF%E5%85%AC%E…

企业网络安全:威胁情报解决方案

什么是威胁情报 威胁情报是网络安全的关键组成部分,可为潜在的恶意来源提供有价值的见解,这些知识可帮助组织主动识别和防止网络攻击,通过利用 STIX/TAXII 等威胁源,组织可以检测其网络中的潜在攻击,从而促进快速检测…

最简单vue获取当前地区天气--高德开放平台实现

目录 前言 一、注册成为高德平台开发者 二、注册天气key 1.点击首页右上角打开控制台 2.创建新应用 三、vue项目使用 1.打开vue项目找到public下的index.html,如果是vue3的话直接在主目录打开index.html文件就行,主要就是打开出口文件 ​编辑 2.根据高德…

全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”

糖尿病是全球高发慢性病中患病人数增长最快的疾病,是导致心血管疾病、失明、肾衰竭以及截肢等重大疾病的主要病因之一。目前中国有近1.4亿成人糖尿病患者,科学的血糖监测和健康管理对于糖尿病患者来说至关重要。 在9月1日全民健康生活方式行动日前夕&am…

Flutter开发- iOS 问题CocoaPods not installed or not in valid state

解决问题方案: 1、先检查本机CocoaPods是否安装,通过gem list 查看是否安装 打开终端,执行gem list,出现图中的数据即为已安装。未安装看第4 步 2、已经安装了CocoaPods,还出现了图中的提示,你可能已经猜…

Django基础6——数据模型关系

文章目录 一、基本了解二、一对一关系三、一对多关系3.1 增删改查3.2 案例:应用详情页3.2 案例:新建应用页 四、多对多关系4.1 增删改查4.2 案例:应用详情页4.3 案例:部署应用页 一、基本了解 常见数据模型关系: 一对一…

软件测试案例 | 气象探测库存管理系统的集成测试计划

将经过单元测试的模块按照设计要求连接起来,组成规定的软件系统的过程被称为“集成”。集成测试也被称为组装测试、联合测试、子系统测试或部件测试等,其主要用于检查各个软件单元之间的接口是否正确。集成测试同时也是单元测试的逻辑扩展,即…

【高阶数据结构】二叉搜索树 {概念;实现:核心结构,增删查,默认成员函数;应用:K模型和KV模型;性能分析;相关练习}

二叉搜索树 一、二叉搜索树的概念 二叉搜索树又称二叉排序树,它可以是一棵空树,若果不为空则满足以下性质: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点…

JavaScript关于函数的小挑战

题目 回到两个体操队,即海豚队和考拉队! 有一个新的体操项目,它的工作方式不同。 每队比赛3次,然后计算3次得分的平均值(所以每队有一个平均分)。 只有当一个团队的平均分至少是另一个团队的两倍时才会获胜。否则&…

企业主流全链路监控系统 - OpenTelemetry(二)

OpenTelemetry 二 4. 部署(python)准备工作(1/5)创建 HTTP Server(2/5)Automatic instrumentation(3/5)增加观测项(Manual)(4/5)向 Co…

Zabbix 5.0 媒体介质 邮箱配置例子

QQ企业邮箱 参考:zabbix 腾讯企业邮箱配置图_harveymomo的博客-CSDN博客

uniapp - 全平台兼容实现上传图片带进度条功能,用户上传图像到服务器时显示上传进度条效果功能(一键复制源码,开箱即用)

效果图 uniapp小程序/h5网页/app实现上传图片并监听上传进度,显示进度条完整功能示例代码 一键复制,改下样式即可。 全部代码 记得改下样式,或直接

java八股文面试[多线程]——自旋锁

优点: 1. 自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗 ,这些操作会导致线程发生两次上下文切换&…

C# textBox 右键菜单 contextMenuStrip

需求: 想在上图空白处可以右键弹出菜单,该怎么做呢? 1.首先,拖出一个 ContextMenuStrip。 随便放哪里都行,如下: 2.在textBox里关联这个“右键控件”即可,如下: 最终效果如下: 以上…