在PHP中上传一个非常大的文件时没有错误?

时间:2009-03-05 15:38:41

标签: php upload

我有一个用于上传文件的PHP表单,它工作正常并在出现问题时显示错误消息。这一切都很好。

问题是,当我使用一个非常大的文件进行测试时,它只是刷新页面,就好像我根本没有发送文件一样,并且表单中的$ _POST变量都没有发送到服务器。 / p>

我想向用户显示错误,让他们知道文件太大了。但是,我不能这样做。

有谁知道发生了什么事?

6 个答案:

答案 0 :(得分:13)

检查PHP ini文件,该文件控制PHP允许上传的文件大小。这些变量很重要:

  • max upload filesize(upload_max_filesize)
  • 最大发布数据大小(post_max_size)
  • 内存限制(memory_limit)

根据您的设置,任何超出这些范围的上传都将被忽略或出错。

文档中的此部分包含最佳摘要:http://ca3.php.net/manual/en/features.file-upload.common-pitfalls.php

编辑:另请注意,大多数浏览器不会发送超过2GB的上传内容。此链接已过时,但提供了一个想法:http://www.motobit.com/help/scptutl/pa98.htm。任何人都有更好的信息来源吗?

服务器也可以施加限制,例如Apache:http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody

要真正了解正在发生的事情,您应该检查您的网络服务器日志,检查浏览器上传限制(如果您使用的是Firefox),并尝试查看print_r($_FILES)是否生成任何有用的错误编号。如果所有其他方法都失败了,请尝试使用firebug中的净流量监视器。关键是确定请求是否甚至是去服务器,以及请求(包括标题)是什么样的。一旦你进入链中,那么你可以回过头来看看PHP如何处理上传。

答案 1 :(得分:6)

你的$ _POST很可能是空的,因为上传超出了 post_max_size 指令:

来自PHP的directives page

  

如果发布数据的大小更大   比post_max_size, $ _POST   和$ _FILES超级全球是空的。   这可以通过各种方式进行跟踪,   例如通过传递$ _GET变量   处理数据的脚本,即   <form action="edit.php?processed=1">,和   然后检查是否$ _GET ['processed']   已经确定了。

答案 2 :(得分:1)

在完全上传之前,您无法知道正在上传的文件的大小。因此,如果要确定文件大小,然后显示大文件的错误,首先必须上载文件,然后检查文件大小。为了上传大文件,你应该在php配置文件php.ini中设置2个设置。 打开它并搜索“upload_max_filesize”并将值设置为您想要的最大值。那么你必须设置POST参数的最大值,因为上传的文件是通过HTTP POST方法收到的。找到“post_max_size”并将其设置为较大的值。

答案 3 :(得分:0)

我会实现一个简单的脚本来执行常规的ajax调用,以了解已经完成了多少上传。然后,您可以实现某种进度条。网上有几个例子:

http://martinjansen.com/2007/04/28/file-upload-progress-bars-with-php/

答案 4 :(得分:0)

max upload filesize(upload_max_filesize) 最大发布数据大小(post_max_size) 是您需要设置的指令。我已经用多个操作系统,浏览器等对它进行了测试,这是你唯一需要担心的两件事。

答案 5 :(得分:0)

除了以前用户回答的选项之外:

max upload filesize (upload_max_filesize)
max post data size (post_max_size)
memory limit (memory_limit)

还有一个,当文件非常大,或者线路繁忙时,需要很多时间来执行此操作,这将达到脚本执行限制。

max_execution_time