为什么PHP不允许上传超过2MB的文件?
您是否曾尝试在网站上上传高质量的照片、演示文稿或视频,而PHP却冷冷地回复:“The uploaded file exceeds the upload_max_filesize directive in php.ini”?熟悉吗?这是一个经典问题,几乎在每个项目中都会遇到。在Stack Overflow上,关于“Change the maximum upload file size”的问题获得了数万次浏览——这绝非偶然。
在本文中,我们将详细解析PHP如何限制文件上传、在哪里进行配置以及如何正确增加限制。您不仅会了解到upload_max_filesize,还会了解到可能让所有努力付诸东流的潜在陷阱。
PHP如何限制文件上传?
当您通过表单提交文件时,PHP会在多个层面检查其大小。如果任何一个层面不通过——文件将无法上传。让我们解析需要更改的三个主要参数,以确保更改最大上传文件大小正常工作。
1. upload_max_filesize — 单个文件的直接限制
这是最明显的参数。它设置单个上传文件的最大大小。PHP默认值为2M(2兆字节)。要增加到例如100MB,需要写入:
upload_max_filesize = 100M2. post_max_size — 整个POST请求的大小
很多人会在这里犯错。即使您增加了upload_max_filesize,但忘记了post_max_size,上传仍然无法工作。为什么?因为文件是在POST请求内部传输的,如果整个请求的大小超过限制——PHP会直接将其截断。
规则很简单:post_max_size必须大于upload_max_filesize。通常将其设置大20-30%。例如:
post_max_size = 120M3. max_execution_time — 上传时间
大文件不会瞬间上传完成。如果文件大小为100MB,而网络速度较慢,脚本可能无法在规定时间内完成。默认情况下max_execution_time = 30秒。对于大文件,请增加到300-600秒:
max_execution_time = 6004. memory_limit — 处理所需的内存
某些PHP脚本在处理前会将文件加载到内存中。如果memory_limit小于文件大小——您将收到错误。建议将其设置为大于post_max_size:
memory_limit = 256M在哪里以及如何更改设置?
现在我们已经知道哪些参数负责更改最大上传文件大小,让我们解析在哪里更改它们。您有三种主要途径:
方法1:php.ini(主配置文件)
这是最可靠的方法。在服务器上找到php.ini文件(通常位于/etc/php/或/usr/local/etc/)。打开它并找到相关指令。如果没有,请在文件末尾添加:
; 允许文件上传(应为On)file_uploads = On
; 单个文件的最大大小upload_max_filesize = 100M
; POST请求的最大大小post_max_size = 120M
; 脚本执行时间max_execution_time = 600
; 内存限制memory_limit = 256M更改后,务必重启Web服务器:
sudo service apache2 restart # 对于Apachesudo service nginx restart # 对于Nginx方法2:.htaccess(仅适用于Apache)
如果您无法访问php.ini(例如在虚拟主机上),可以尝试通过网站根目录下的.htaccess文件:
php_value upload_max_filesize 100Mphp_value post_max_size 120Mphp_value max_execution_time 600php_value memory_limit 256M重要提示:此方法仅在