file-upload - 当上传大于 POST_MAX_SIZE 时,PHP $_POST/$_FILES 为空

标签 file-upload php

<分区>

Possible Duplicate:
How to detect if a user uploaded a file larger than post_max_size?

我正在编写一个脚本来处理从 Web 应用程序上传的文件。我对可以上传到我的应用程序的文件大小设置了限制(存储空间限制)。我目前正在尝试将一些验证代码放入其中,以检查以确保用户确实上传了文件,以便我可以向他们显示一条很好的错误消息。但我也希望能够在用户上传的文件太大时向他们显示一条错误消息。我可以为此使用 Javascript,但我也想要一个 PHP 检查,以防他们没有启用 Javascript。

我已将 PHP.ini 中的 POST_MAX_SIZE 变量设置为最大文件上传大小,但这产生了意外问题。如果有人试图上传一个大于 POST_MAX_SIZE 的文件,二进制数据将被截断为最大大小,并且 $_FILES 数组不包含该文件的条目。这与用户根本没有提交文件时会发生的行为相同。

这使得很难判断为什么 $_FILES 数组不包含文件,即它是否从未上传过,或者它是否太大而无法完整发送。

有没有办法区分这两种情况?换句话说,有没有办法判断 POST 数据是否是为文件发送的,但在发送整个文件之前被过早截断了?

最佳答案

虽然看起来很奇怪,this is intentional behavior ,因为 POST_MAX_SIZE 是一个低级别的最终故障保护,并且为了保护你和防止 DOS 攻击,服务器除了在中途意识到它接收的数据超过它可以安全处理的数据时丢弃所有 POST 数据之外别无他法.如果你知道你需要一次接收比这个更多的数据,你可以提高这个值(但要确保你的服务器可以处理这将增加的负载)但我建议研究其他处理你的用例的方法,遇到 POST_MAX_SIZE 对我来说意味着可能有比一个大规模 HTTP POST 更强大的解决方案,例如将其拆分为多个 AJAX 调用。

与 POST_MAX_SIZE 不同的是 UPLOAD_MAX_SIZE,它是单个文件限制的 php.ini 设置,这就是我假设您最初谈论的内容。它限制任何一个上传文件的大小,如果一个文件超过这个值,它会设置$_FILES['file']['error']1 .一般来说,您希望您的站点设置如下:

  • <form> MAX_FILE_SIZE 应设置为您实际希望为此表单接受的最大值。虽然任何试图利用您网站的用户都可以解决这个问题,但这对实际使用您网站的用户来说是件好事,因为浏览器将 ( actually, could ) 防止他们浪费带宽尝试上传它。这应该始终小于您的服务器端设置。
  • UPLOAD_MAX_FILESIZE是服务器将接受的最大大小,丢弃任何更大的大小并向 $_FILES 报告错误大批。这应该大于您想要在整个站点中实际接受的最大文件。
  • POST_MAX_SIZE是您的服务器愿意在单个 POST 请求中接受的最大数据量。这必须大于 UPLOAD_MAX_SIZE 才能成功上传大型文件,并且必须大得多才能一次上传多个文件。我可能会建议使用 UPLOAD_MAX_FILESIZE * 4.1 的值 - 这将允许一次四个大文件,以及一些额外的数据。当然是 YMMV,您应该确保您的服务器能够正确处理您决定设置的任何值。

关于如何判断的具体问题,我链接到关于 POST_MAX_SIZE 的 PHP 文档,建议在表单中设置一个 get 变量,即

<form action="edit.php?processed=1">

但是正如我上面所说,如果您遇到这个问题,您可能需要探索其他上传方法。

关于file-upload - 当上传大于 POST_MAX_SIZE 时,PHP $_POST/$_FILES 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11476139/

相关文章:

php - MySQL 到 Redis 在一个巨大的表上,如何加快速度?

php - 如何在 mac osx mamp 上为 php 安装 apc?

php - 当网站托管在远程服务器 wordpress 中时,导航无法正确呈现

php - 如何将 MySQL foreach 循环添加到 DOMDocument XML

java - Servlets:在哪里存储上传的文件?

jquery - 如何为AjaxUpload动态设置参数?

asp.net - 超出最大请求长度。

PHP 错误 in_array() [function.in-array] : Wrong datatype for second argument

java - Spring 上传文件

javascript - 让 Cloudinary 直接上传以使用嵌套模型和动态添加的上传字段