Antd多文件上传后台接收为null问题

Antd多文件上传后台接收为null问题
在使用antd开发过程中,Upload组件的上传,一般是通过action配置后端接口地址,自动上传文件;但是当文件数量较多时,需要进行手动上传,但是手动上传后台一直无法接收到数据,数据为null。

代码实现
前段组件代码如下:

 const onRemove = (file) => {
      this.setState((state) => {
        const index = state.fileList.indexOf(file);
        const newFileList = state.fileList.slice();
        newFileList.splice(index, 1);
        return {
          fileList: newFileList,
        };
      });
    };
    
    const beforeUpload = (file) => {
      const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
      if (!isJpgOrPng) {
        message.error('请上传图片格式文件!');
        return isJpgOrPng || Upload.LIST_IGNORE;
      }
      this.setState(state => ({
        fileList: [...state.fileList, file],
      }));
      return false;
    };

    <Upload
      fileList={fileList}
      onRemove={onRemove}
      beforeUpload={beforeUpload}
      directory
      accept=".png,.jpg,.jpeg"
      showUploadList={false}
      onChange={this.onChange}
    >
      <Button
        icon={<UploadOutlined />}
      >
        Click to upload
      </Button>
    </Upload>
复制代码

前端上传逻辑代码:

    const formData = new FormData();
    // 组装数据
    fileList.forEach((file) => {
      formData.append('files', file);
    });
    formData.append('id', galleryId);
    // 保存图片请求接口
    reqwest({
      // 上传url
      url: 'url',
      method: 'post',
      // 必须false才会避开jQuery对 formdata 的默认处理
      processData: false,  
      // 必须false才会自动加上正确的Content-Type        
      contentType: false, 
      data: formData,
      success: (res) => {
          message.success('上传图片成功');
      },
      error: () => {
          message.error('上传图片失败');
      },
    });
复制代码

后端代码:

  public Message insertPic(@RequestParam(value = "files", required = true) MultipartFile[] files) {
        // 判断file数组不能为空并且长度大于0
        if (files != null && files.length > 0) {
            //循环获取file数组中得文件
            for (int i = 0; i < files.length; i++)  {
                    MultipartFile file = files[i];
            }
        }
    }

复制代码

分析
F12查看请求头:

在这里插入图片描述

F12查看入参:

在这里插入图片描述

因为接口是可以调通的,我一直以为是后端在处理数据时,将数据转换成null,

解决
百度之后:
定义文件解析器MultipartResolver的时候,有没有设置resolveLazily属性为true(默认值为false)。可能是MultipartResolver在initBinder的时候默认会自动解析request,并清空文件流里的内容,导致在controller中的request获取不到文件流信息。 但是按照网上进行相关设置之后,还是不行,仍然为null。

当用postman进行接口测试时,竟然可以了,我意识到可能并不是后端的问题,又仔细看了一下请求头、入参,发现传送的参数类型是[object Object],打断点查看fileList:

在这里插入图片描述

原来fileLsit不是File对象数组,originFileObj才是真正的File。修改代码:

 fileList.forEach((file) => {
    formData.append('files', file.originFileObj, file.name);
 });
复制代码

果然成功了,终于泪流满对面啊~~~,查看入参

在这里插入图片描述

总结
仔细查看antd文档

FileList确实是一个File对象数组

在这里插入图片描述

但是仔细阅读FAQ发现

在这里插入图片描述

最后
如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:http://github.crmeb.net/u/defu不胜感激 !

PHP学习手册:https://doc.crmeb.com
技术交流论坛:https://q.crmeb.com

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CRMEB定制开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值