问题情境
最近在使用 antd
的 Upload
组件时遇到这样一个问题: 在未设置属性action
时,Upload
组件总会向当前页面发送一个xhr
请求
问题解决实现
搜索问题后发现有相似问题: 传送门
看到有这样一条评论:
因为当时刚入手项目, 也是 React
和 antd
的新手, 所以当时的解决方案是在 nginx
配置请求转发, 现在回过头来再处理下这个问题
配置action
属性就要单独走请求和错误处理, 超时时间之类的 , 而customRequest
官方文档上没有直接给demo
,所以当时的处理是通过beforeUpload
和onChange
实现上传, 既没有配置action
,也没有自定义customRequest
在beforeUpload
中对上传文件合法情况校验, 在onChange
中处理文件上传, 文件回显等,这样处理其实也还好, 但就是没有配置action
会导致上传时总是向向当前页面发送一个 xhr
请求,这个请求本地开发没什么问题, 当时部署到线上就会出现比较大的问题了:
- 会带着 payload 向当前页面请求
- 如果使用配置 nginx 转发的话, 因为上传文件一般比较大, 走 xhr 请求还带着比较大的 payload, 而数据较大的话一般 nginx 直接就拒掉了, 除非让
nginx
对请求数据相应也变大一些, 但这样就不太合理了
所以讲来讲去, 还是要回到customRequest
上来
官方文档告诉我们这个属性是干嘛的
然后具体怎么使用让我们自己去另一个仓库看代码
然后看一下demo
:
基本了解了, 就是一个回调函数, 所以直接加上这个属性, 回调入参onSuccess
这样改造的话 可以在不改变现有逻辑的情况下 解决这个xhr的问题
解决方案
关于不想使用action
属性, 还不想出现这个问题的, 在调研中, 我想到了几个解决方案:
方案1: 如上, 正常使用beforeUpload
,onChange
, 就是需要再最后把customRequest
绑定在Upload
组件上
方案2: 在beforeUpload
中, 条件照常判断, 不过最后都要return false
,return false
之后就会阻断发生xhr
请求, 文件上传的实现可以在beforeUpload
的条件判断中加一个变量结合onChange
实现
方案3(推荐): 根据官方文档的demo: github.com/react-compo... 来自己实现
方案4: 全换成自己实现的上传组件
方案5: 魔改Upload
组件, 引用魔改的组件