项目中使用antd中的upload组件file对象到底是info.file还是info.file.originFileObj_坑

简介: 在Ant Design的Upload组件中,`onChange`事件处理函数接收一个对象参数,其中`file`字段在不同情况下可能是一个File对象或包含`originFileObj`属性的对象。为了兼容,可以使用`info.file.originFileObj ? info.file.originFileObj : info.file`来确保获取到原始的File对象。官方建议这种写法,并将在未来的大版本中统一返回包含`originFileObj`属性的对象。

昨天还好好的,今天将文件上传封装成了一个简单的组件,其实也就相对封装了样式,但是今天就不行了,文件传给后端,后端接受不到file对象了。

一般写法:

<div >
    <Input 
      value={
   aclFileName}
      placeholder={
   '请选择文件'} 
      title={
   `ACL文件`} 
      onChange={
   (e) => this.inputName(`aclFileName`, e.target.value)} 
      />
    <Upload
        maxCount={
   1}
        action="#"
        showUploadList={
   false}
        onChange={
   this.chengFileFun}
        beforeUpload={
   this.beforeUpload}
    >
    <Button rsType="noIcon" title="选择文件"></Button>
        <a href="#!" style={
   {
    color: '#ccc', fontSize: '12px', marginTop: '8px', marginLeft: '8px' }}>请上传文件</a>
    </Upload>
</div>

beforeUpload这个函数返回的返回值伟false的时候不自动上传。

    beforeUpload = () => {
   
        return false
    }

onchange事件,上传中、完成、失败都会调用这个函数。

文件状态改变的回调,返回为:

{
file: { /* … / },
fileList: [ /
/ ],
event: { /
… */ },
}

1.file 当前操作的文件对象。

{
   
   uid: 'uid',      // 文件唯一标识,建议设置为负数,防止和内部产生的 id 冲突
   name: 'xx.png'   // 文件名
   status: 'done', // 状态有:uploading done error removed,被 beforeUpload 拦截的文件没有 status 属性
   response: '{"status": "success"}', // 服务端响应内容
   linkProps: '{"download": "image"}', // 下载链接额外的 HTML 属性
}

2.fileList 当前的文件列表。
3.event 上传中的服务端响应内容,包含了上传进度等信息,高级浏览器支持;

说明onChange函数接收了一个对象作为形参。

    chengFileFun = (info) => {
   
    //因为没有 当前url#所有会触发error
    if (file.file.status === 'error') {
   
        let name = info.file.name
        let nameSplit = name.split('.')
        if (nameSplit[nameSplit.length - 1] === 'txt') {
   
            let fileObj = info.file
            this.setState({
   
                aclFileName: name,
                file:fileObj
            })
        } else {
   
            message.warning("请上传txt文件")
        }
    }
}

但是上午的时候突然发现info.file并不是文件对象,有时候又会是。

    chengFileFun = (info) => {
   
    //因为没有 当前url#所有会触发error
    if (file.file.status === 'error') {
   
        let name = info.file.name
        let nameSplit = name.split('.')
        if (nameSplit[nameSplit.length - 1] === 'txt') {
   
            let fileObj = info.file.originFileObj ? info.file.originFileObj : info.file
            this.setState({
   
                aclFileName: name,
                file:fileObj
            })
        } else {
   
            message.warning("请上传txt文件")
        }
    }
}

info.file.originFileObj ? info.file.originFileObj : info.file 使用三木可以很好的解决问题;

官方解释:
在这里插入图片描述

onChange 为什么有时候返回 File 有时候返回 { originFileObj: File }?

历史原因,在 beforeUpload 返回 false 时,会返回 File 对象。在下个大版本我们会统一返回 { originFileObj: File } 对象。当前版本已经兼容所有场景下 info.file.originFileObj 获取原 File 写法。你可以提前切换。

目录
相关文章
|
存储 JavaScript API
vue3+ant design vue 自定义文件上传和自定义上传进度条
1.关键点是Upload组件中customRequest的API,它能通过覆盖默认的上传行为,可以自定义自己的上传实现(具体可看官方文档); 2.通过在Upload组件中绑定progress实现。 下面是详细代码
3754 0
|
Web App开发 流计算 内存技术
安防领域常用的视频流协议介绍
安防领域常用的视频流协议介绍
1499 0
|
Rust JavaScript Unix
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
13356 0
|
设计模式 数据安全/隐私保护
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
这篇文章介绍了在Next.js框架下,如何处理中后台管理系统中特殊页面(如登录页)不包裹根布局(RootLayout)的问题。作者指出Next.js的设计理念是通过布局的嵌套来创建复杂的页面结构,这虽然保持了代码的整洁和可维护性,但对于特殊页面来说,却造成了不必要的布局包裹。文章提出了一个解决方案,即通过判断页面的skipGlobalLayout属性来决定是否包含RootLayout,从而实现特殊页面不包裹根布局的目标。
483 0
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
|
4月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
38014 10
|
10月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
12793 33
MCP客户端调用看这一篇就够了(Java版)
|
缓存 前端开发 JavaScript
浅浅阅读umi中InitialState插件源码 - 杨磊
InitialState插件源码的简要介绍
1332 0
浅浅阅读umi中InitialState插件源码 - 杨磊
|
缓存 JavaScript 前端开发
拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
12853 2
|
前端开发 Java
后端BUG系列之:SpringBoot上传文件太大 报错 Maximum upload size exceeded
这篇文章讨论了SpringBoot应用中上传文件过大导致的错误"Maximum upload size exceeded",并提供了通过修改`application.properties`文件中的上传限制配置来解决这个问题的方法。
|
JavaScript 测试技术 API
如何从 Vue 2 无痛升级到 Vue 3,一文搞定!
如何从 Vue 2 无痛升级到 Vue 3,一文搞定!
12798 8

热门文章

最新文章