上传业务中文件大小限制是必须要考虑的。多大合适,如何限制?
在上传文件时,form表单要设置enctype=“multipart/form-data”以支持文件上传。文件的内容会被放在body体中。这时,会涉及到nginx的一个配置:client_max_body_size。此值必须要大于可上传文件的最大大小。同时也要考虑,如果同时上传好几个文件,这个值应该是多个文件之和。当然,别忘记,还可能有其他表单内容也要计算在其中的。
php中也有相关配置。比如是否开启上传功能的配置:file_uploads。可选值为on/off。同时上传文件个数:max_file_uploads。单个上传文件的大小:upload_max_filesize。最重要的是:post_max_size,与nginx的配置类似,php也会限制post body的大小。如果上传文件单个限制为8M,同时允许上传10个文件。那么post_max_size最少要设置为80M才行。
出错现象
nginx的client_max_body_size限制太小会很快的显示413 request entity too large错误。
php的post_max_size限制太小,在我的环境中会等很久,页面才会变成加载完成状态,但是页面没任何变化,页面中的js失效了。莫名其妙的感觉。可在nginx错误日志中发现如下两条错误信息
FastCGI sent in stderr: “PHP message: PHP Warning: POST Content-Length of 131155517 bytes exceeds the limit of 6291456 bytes in Unknown on line 0” while reading response header from upstream
upstream timed out (110: Connection timed out) while reading upstream
php的upload_max_filesize限制太小则会通过$_FILES变量给出文件上传错误为UPLOAD_ERR_INI_SIZE。
总结
nginx配置:client_max_body_size 限制为body大小。计算所有上传的文件以及参数数据的总和。
php配置:post_max_size 同上。
php配置:upload_max_filesize 限制单个上传文件的大小。