我有一个用于上传文件的 PHP 表单,它工作正常,如果出现问题,它会显示错误消息。这一切都很好。
问题是当我使用一个非常大的文件进行测试时,它只是刷新页面,就好像我根本没有发送文件一样,并且表单中的 $_POST 变量甚至都没有发送到服务器。
我想向用户显示一个错误,让他们知道文件太大。但是,我不能这样做。
有谁知道发生了什么?
检查您的 PHP ini 文件,该文件控制 PHP 允许上传的文件大小。这些变量很重要:
根据您的设置,超出这些范围的任何上传都将被忽略或错误输出。
文档中的这一部分有最好的总结:http ://ca3.php.net/manual/en/features.file-upload.common-pitfalls.php
编辑:另请注意,大多数浏览器不会发送超过 2GB 的上传文件。此链接已过时,但提供了一个想法:http ://www.motobit.com/help/scputl/pa98.htm 。任何人都有更好的信息来源?
服务器也可以施加一些限制,例如 Apache:http ://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody
要真正了解发生了什么,您可能应该检查您的网络服务器日志,检查浏览器上传限制(如果您使用的是 firefox),并尝试查看是否print_r($_FILES)
生成任何有用的错误编号。如果一切都失败了,请尝试 firebug 中的网络流量监视器。关键是要确定请求是否甚至发送到服务器,以及请求(包括标头)是否是这样的。一旦你在链中走得那么远,你就可以回去看看 PHP 是如何处理上传的。
您的 $_POST 很可能是空的,因为上传超出了post_max_size指令:
从 PHP 的指令页面:
如果 post 数据的大小大于 post_max_size,则 $_POST 和 $_FILES 超全局变量为空。这可以通过多种方式进行跟踪,例如通过将$_GET 变量传递给处理数据的脚本,即
<form action="edit.php?processed=1">
,然后检查是否设置了$_GET['processed']。
在完全上传之前,您无法知道正在上传的文件的大小。所以如果你想确定文件大小,然后对大文件显示错误,首先你必须上传文件,然后检查文件大小。为了上传大文件,您应该在您的 php 配置文件 php.ini 中设置 2 个设置。打开它并搜索“upload_max_filesize”并将值设置为您想要的最大值。那么您必须设置 POST 参数的最大值,因为上传的文件是通过 HTTP POST 方法接收的。找到“post_max_size”并将其设置为较大的值。
我将实现一个简单的脚本,该脚本执行常规的 ajax 调用以了解已完成了多少上传。然后,您可以实现某种进度条。网上有几个例子:
http://martinjansen.com/2007/04/28/file-upload-progress-bars-with-php/
最大上传文件大小 (upload_max_filesize) 最大发布数据大小 (post_max_size) 是您需要设置的指令。我已经用多个操作系统、浏览器等对其进行了测试,这是您唯一需要担心的两件事。
除了前用户回答的选项之外:
max upload filesize (upload_max_filesize)
max post data size (post_max_size)
memory limit (memory_limit)
还有一种情况,当文件很大,或者线路很忙的时候,需要很多时间来执行这个操作,这会达到脚本执行限制的上限。
max_execution_time