【问题标题】:$_FILES["file"]["size"] returning 0?$_FILES["file"]["size"] 返回 0?
【发布时间】:2020-05-08 21:41:54
【问题描述】:

我正在尝试使用 PHP 上传内容,并对允许上传的总大小设置限制。我想将我的上传限制为 2MB,但出于某种原因,每当我尝试使用这样的 if 语句进行检查时:

if (($_FILES["file"]["size"] < 2097152))

一个大的文件(例如一个 7mb 的文件)将通过 if 语句,因为无论出于何种原因,如果我打印 $_FILES["file"]["size"],它将返回 0,而不是正确的字节数。如果我尝试上传较小的内容,例如 342kb,$_FILES["file"]["size"] 将返回正确的大小。

有没有办法让$_FILES["file"]["size"] 实际保持文件的正确大小?否则我不知道如何解决这个问题。

【问题讨论】:

  • 您的 php.ini 中可上传数据的限制是多少?您确定您尝试上传的文件 (7MB) 确实已正确上传吗?我觉得不是……
  • 我不是 100% 确定,但文件的最大上传大小由 php.ini 设置,即 php 配置文件。如果文件大于该限制,它甚至永远不会被上传,这就是为什么你会得到一个文件大小为 0。
  • 尝试var_dump($_FILES); ;) 并检查错误报告...
  • 你是对的,7mb的文件没有正确上传。我得到一个返回码 1,因为 php.ini 有 2MB 的限制。这就是为什么我试图编写 if 语句,但 if 语句不起作用。编辑:由于某种原因,大于 2MB 的文件实际上会建立连接并开始上传,它在上传文件后会失败。

标签: php file-upload


【解决方案1】:

由于任何原因(上传失败、超出限制等)中止的文件将显示为大小 0

在对其余的 eupload 数据进行任何操作之前,您必须检查上传成功:

if(array_key_exists('file', $_FILES)){
    if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
       echo 'upload was successful';
    } else {
       die("Upload failed with error code " . $_FILES['file']['error']);
    }
}

错误代码定义为here。在您的情况下,如果您硬编码了 2meg 限制并且有人上传了 2.1 meg 文件,那么错误代码将为 UPLOAD_ERR_INI_SIZE(又名2),即“超出 .ini 文件中设置的限制”。

【讨论】:

  • 错误码为 0,大小也为 0...我们如何绕过那个?
  • 这真的取决于您希望您的应用程序如何反应,因为您可能遇到@Deji 前面描述的错误代码和大小将返回 0 的情况。我认为发生这种情况的一个例子是如果您在 Windows 资源管理器中打开压缩文件并尝试将文件从呈现给您的文件列表中拖放到某些 javascript 文件上传器
【解决方案2】:
if( $_FILES['file']['size'] && $_FILES['file']['size'] < (2<<20))

试试看。

【讨论】:

  • 非常好的方法,虽然你可以解释代码 - 不是每个人都知道如何使用二进制移位来进行幂计算
【解决方案3】:

我在之前的评论中认为,您的问题是 php.ini 中可上传文件的限制小于 7MB。
所以你可以尝试使用

if ($_FILES["file"]["size"] > 0 && $_FILES["file"]["size"] < 2097152)

考虑一下,如果您将限制(在 php.ini 中)设置为 2MB,那么该检查可以很容易地写成

if ($_FILES["file"]["size"] > 0)

【讨论】:

    【解决方案4】:

    在上传之前检查是否有任何错误。这些通常会暴露问题所在。 创建一个类以返回任何代码错误并将其用于上传文件。

     class UploadException extends Exception
    {
    public function __construct($code) {
        $message = $this->codeToMessage($code);
        parent::__construct($message, $code);
    }
    
    private function codeToMessage($code)
    {
        switch ($code) {
            case UPLOAD_ERR_INI_SIZE:
                $message = "The uploaded file exceeds the upload_max_filesize directive in php.ini.";
                break;
            case UPLOAD_ERR_FORM_SIZE:
                $message = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form";
                break;
            case UPLOAD_ERR_PARTIAL:
                $message = "The uploaded file was only partially uploaded";
                break;
            case UPLOAD_ERR_NO_FILE:
                $message = "No file was uploaded";
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                $message = "Missing a temporary folder";
                break;
            case UPLOAD_ERR_CANT_WRITE:
                $message = "Failed to write file to disk";
                break;
            case UPLOAD_ERR_EXTENSION:
                $message = "File upload stopped by extension";
                break;
    
            default:
                $message = "Unknown upload error";
                break;
        }
        return $message;
      }
    }
    

    现在在对文件进行任何操作之前检查上传是否成功。 如果未成功上传,则会导致错误提示您出了什么问题。

    这样,您不必浪费时间猜测错误代码的含义或必须一直查找错误代码,您自己编写的错误消息将返回与错误代码对应的消息。

       if ($_FILES['realFile']['error'] === UPLOAD_ERR_OK) {
            echo 'no problems encountered. File was uploaded with success';
        } else {
            throw new UploadException($_FILES['realFile']['error']);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多