$ _FILES [“file”] [“size”]返回0?

时间:2011-10-31 20:54:07

标签: php

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

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

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

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

4 个答案:

答案 0 :(得分:30)

因任何原因而中止的文件(上传失败,超出限制等等)将显示为大小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兆字节的文件,那么错误代码将是UPLOAD_ERR_INI_SIZE(又名2),这是“超出.ini文件中设置的限制”。

答案 1 :(得分:4)

if( $_FILES['file']['size'] && $_FILES['file']['size'] < (2<<20))

试试。

&LT;&LT;是按位移位运算符,十进制2是二进制“10”,然后加20个零。

答案 2 :(得分:1)

我在上一篇评论中的假设是,你的问题是php.ini中的可上传文件限制小于7MB。 所以你可以尝试使用

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

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

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

答案 3 :(得分:0)

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

 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']);
    }