我正在尝试使用PHP上传内容,并对允许上传的总大小设置限制。我想将我的上传限制为2MB,但出于某种原因,每当我尝试检查if语句时这样:
if (($_FILES["file"]["size"] < 2097152))
大文件(例如7mb文件)将通过if语句,因为无论出于何种原因,如果我打印$ _FILES [“file”] [“size”],它将返回0,而不是正确字节数。如果我尝试上传较小的内容,例如342kb,$ _FILES [“file”] [“size”]将返回正确的大小。
有没有让$ _FILES [“file”] [“size”]实际保持文件的正确大小?否则我不知道如何解决这个问题。
答案 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']);
}