上传文件超过1Mb,返回413错误

   近期手头上有一个项目在整体上云,期间遇到一个Cloud storage上传文件超过限制的问题,在此记录一下。

   背景是:IBM Cloud的K8s + PersistentVolumeClaim + Webdav + Ingress(Nginx)

   详细情况是 有许多项目部署在K8s集群上,并且用PersistentVolumeClaim(大小为20G)做为一块虚拟的磁盘,存储项目中需要用到的一些静态文件;并且在集群中的PVC之上通过webdav协议,提供了外部的读写能力(主要是通过Cyberduck等软件进行上传文件的功能);最后使用了Ingress作了地址的映射。

   在实际的使用过程中发现一个问题,通过Cyberduck上传文件时,小于1Mb的文件能上传成功,但是大于1Mb的文件会返回413错误(413 Request Entity Too Large)。

 Cyberduck上传失败截图

   通过调研,排除了PersistentVolumeClaim和webdav对文件大小的限制,最终发现nginx有相关的设置:

   client_max_body_size

   该设置规定了文件大小,默认是1Mb。

   

   最终找到了Ingress的annotations里,ingress.kubernetes.io/proxy-body-size对应的设置就是nginx的 client_max_body_size,于是在ingress.yaml中加上了如下配置:

  annotations:
    ingress.bluemix.net/client-max-body-size: 64m

   由于我们的环境装的IBM Cloud,查阅annotation的具体配置方法可以参考https://console.bluemix.net/docs/containers/cs_annotations.html#ingress_annotation

   对其他版本的Ingress,需要配置

annotations:
    ingress.kubernetes.io/proxy-body-size: "50m"

   或者

annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"

   

   It works!

   

   写在最后:

   1. 改完yaml文件配置别忘了重新apply。

   2. 与client_max_body_size类似的nginx设置还有client_header_timeout, client_body_timeout, proxy_connect_timeout等,感兴趣的小伙伴可以自行研究。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
`antd` 的 `Upload` 组件提供了 `beforeUpload` 钩子函数,这个函数的返回值决定了是否允许文件上传。如果你返回一个 `Promise`,那么 `Upload` 组件会等待该 `Promise` 的解决结果。如果 `Promise` 被解决为 `true`,则允许上传;如果被解决为 `false`,则不允许上传。 如果你发现返回 `Promise` 后多文件上传变成了单个文件上传,可能是因为 `Promise` 的逻辑处理不当导致的。具体来说,如果在 `Promise` 的回调函数中没有正确地处理多个文件的上传逻辑,或者 `Promise` 被错误地设计为只处理单个文件,那么就可能只上传了一个文件。 解决这个问题的关键在于确保 `beforeUpload` 返回的 `Promise` 能够正确处理所有待上传的文件。具体操作如下: 1. 确保 `beforeUpload` 的 `Promise` 逻辑能够处理传入的所有文件。 2. 在 `Promise` 解决的回调函数中,确保每个文件都被正确处理。 3. 如果需要对文件上传进行额外的控制或验证,确保这些逻辑不会阻碍其他文件的上传。 以下是一个简单的示例代码,展示了如何在 `beforeUpload` 中返回 `Promise` 并处理多个文件: ```javascript const uploadProps = { beforeUpload: (file) => { // 创建一个 Promise 对象 return new Promise((resolve, reject) => { // 假设这里是进行一些异步验证逻辑 // 例如验证文件大小,类型等 // 以下是验证文件大小的示例 const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { // 如果文件大于2MB,则拒绝上传,并显示错误信息 reject(new Error('文件大小不能超过2MB')); } else { // 如果通过了验证,则允许上传 resolve(); } }); }, // 其他属性... }; ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值