上传接口http413问题总结

问题描述

上传接口上传9.3M的TXT文件报:HTTP Status Code: 413 Request Entity Too Large

此问题通过搜索很快能定位到需要设置NGINX的client_max_body_size,查看当前NGINX发现已经配置client_max_body_size为16M,没有解决问题。

进一步测试,发现上传8.1M的文件没有问题,但是上传9.2M出现413问题。

解决方案

猜测client_max_body_size需要调整为上传文件大小的两倍,调整client_max_body_size到30M,上传9.2M文件成功

根本原因分析

进一步测试,发现上传9.3M的TXT文件,接口Request的Content-Length字节为19526438,相当于18.6M。这个大小已经超过最初NGINX设置的client_max_body_size大小16M,所以最初上传9.3M失败。而之前测试的8.1M的TXT文件它的Content-Length为16109146,不到16M,所以上传成功。

为什么原始文件上传后,它的Request的Content-Length会变成原始文件大小的两倍呢?

查询文档发现,TXT文件的编码不同,会导致在上传时的Content-Length大小不同。这个上传接口的Content-Type为multipart/form-data,会将上传文件转换成二进制编码进行上传。而一般TXT文件的编码方式都是Unicode。Unicode转换成二进制导致最终的Content-Length变大。