#php #file-upload
#php #загрузка файла
Вопрос:
Я пытаюсь загрузить что-то с помощью PHP и установить ограничение на общий размер, который я разрешаю загружать. Я хочу ограничить свои загрузки до 2 МБ, но по какой-то причине всякий раз, когда я пытаюсь проверить с помощью оператора if, подобного этому:
if (($_FILES["file"]["size"] < 2097152))
Файл большого размера (например, файл размером 7 МБ) будет проходить через оператор if, потому что по какой-либо причине, если я напечатаю $_FILES["file"]["size"]
, он вернет 0 вместо нужного количества байтов. Если я попытаюсь загрузить что-то меньшее, например 342 КБ, оно $_FILES["file"]["size"]
вернет правильный размер.
Есть ли $_FILES["file"]["size"]
какой-либо способ фактически сохранить правильный размер файла? В противном случае я не знаю, как решить эту проблему.
Комментарии:
1. Каков предел загружаемых данных в вашем php.ini? Вы уверены, что файл, который вы пытались загрузить (7 МБ), действительно был загружен правильно? Я думаю, что это не так…
2. Я не уверен на 100%, но максимальный размер загружаемого файла устанавливается php.ini, файлом конфигурации php. Если размер файла превышает это ограничение, он даже не будет загружен для начала, поэтому вы получите размер файла 0.
3. попробуйте
var_dump($_FILES);
😉 и проверьте сообщение об ошибках…4. Вы правы, файл размером 7 мб загружен неправильно. Я получаю код возврата 1, потому что php.ini имеет ограничение в 2 МБ. Вот почему я пытаюсь написать оператор if, но оператор if не работает. РЕДАКТИРОВАТЬ: по какой-то причине файл размером более 2 МБ фактически установит соединение и начнет загрузку, он просто завершается сбоем после загрузки файла.
Ответ №1:
Файл, который прерывается по какой-либо причине (ошибка загрузки, превышение лимитов и т. Д.), Будет отображаться как размер 0
Вы должны проверить УСПЕШНОСТЬ загрузки, прежде чем что-либо делать с остальными загружаемыми данными:
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']);
}
}
Здесь определены коды ошибок. В вашем случае, если вы жестко задали ограничение в 2 мегабайта, а кто-то загружает файл размером 2,1 мегабайта, то код ошибки будет UPLOAD_ERR_INI_SIZE (он же 2
), что означает «превышает ограничение, установленное в файле .ini».
Комментарии:
1. Код ошибки равен 0, размер также равен 0… как нам обойти это?
2. Это действительно зависит от того, как вы хотите, чтобы ваше приложение реагировало, потому что у вас может быть случай, подобный описанному ранее @Deji, где код ошибки и размер возвращали бы 0. Я думаю, что одним из примеров этого является то, что вы открываете архивированный файл в проводнике Windows и пытаетесь перетащить файл из представленного вам списка файлов в определенные программы загрузки файлов javascript
Ответ №2:
if( $_FILES['file']['size'] amp;amp; $_FILES['file']['size'] < (2<<20))
Попробуйте это.
<< — оператор побитового сдвига, десятичное число 2 равно двоичному «10», затем добавьте 20 нулей.
Комментарии:
1. очень хороший способ, хотя вы могли бы объяснить код — не все знают, как использовать двоичный сдвиг для вычисления мощности
Ответ №3:
Как я предполагал в своем предыдущем комментарии, ваша проблема в том, что ограничение загружаемого файла в php.ini составляет менее 7 МБ.
Итак, вы могли бы попробовать использовать
if ($_FILES["file"]["size"] > 0 amp;amp; $_FILES["file"]["size"] < 2097152)
Учтите, что если вы установите свой лимит (в php.ini) равным 2 МБ, эту проверку можно легко записать как
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']);
}