Как проверить, загрузил ли пользователь файл в PHP? - PullRequest
49 голосов
/ 03 июня 2009

Я делаю некоторую проверку формы, чтобы убедиться, что файл, загруженный пользователем, имеет правильный тип. Но загрузка необязательна, поэтому я хочу пропустить проверку, если он ничего не загрузил и отправил оставшуюся часть формы. Как я могу проверить, загрузил ли он что-то или нет? Будет ли $_FILES['myflie']['size'] <=0 работать?

Ответы [ 7 ]

122 голосов
/ 03 июня 2009

Вы можете использовать is_uploaded_file():

if(!file_exists($_FILES['myfile']['tmp_name']) || !is_uploaded_file($_FILES['myfile']['tmp_name'])) {
    echo 'No upload';
}

Из документов:

Возвращает TRUE, если файл с именем имя файла было загружено через HTTP POST. Это полезно, чтобы гарантировать, что злоумышленник не пытался обмануть скрипт для работы с файлами при который не должен работать - для экземпляр, /etc/passwd.

Этот вид проверки особенно важно, если есть шанс, что все, что сделано с загруженными файлами может раскрыть их содержание пользователь или даже другим пользователям на та же система.

РЕДАКТИРОВАТЬ: я использую это в моем классе FileUpload, на случай, если это поможет:

public function fileUploaded()
{
    if(empty($_FILES)) {
        return false;       
    } 
    $this->file = $_FILES[$this->formField];
    if(!file_exists($this->file['tmp_name']) || !is_uploaded_file($this->file['tmp_name'])){
        $this->errors['FileNotExists'] = true;
        return false;
    }   
    return true;
}
10 голосов
/ 14 июля 2014

Этот код работал для меня. Я использую несколько загрузок файлов, поэтому мне нужно было проверить, была ли какая-либо загрузка.

HTML часть:

<input name="files[]" type="file" multiple="multiple" />

PHP часть:

if(isset($_FILES['files']) ){  


foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){

      if(!empty($_FILES['files']['tmp_name'][$key])){

    //  things you want to do
    }
}
9 голосов
/ 18 июня 2012

@ karim79 имеет правильный ответ, но мне пришлось переписать его пример в соответствии с моими целями. В его примере предполагается, что имя отправленного поля известно и может быть жестко запрограммировано. Я сделал этот шаг дальше и сделал функцию, которая будет сообщать мне, были ли загружены какие-либо файлы, без необходимости знать имя поля загрузки.

/**
 * Tests all upload fields to determine whether any files were submitted.
 * 
 * @return boolean
 */
function files_uploaded() {

    // bail if there were no upload forms
   if(empty($_FILES))
        return false;

    // check for uploaded files
    $files = $_FILES['files']['tmp_name'];
    foreach( $files as $field_title => $temp_name ){
        if( !empty($temp_name) && is_uploaded_file( $temp_name )){
            // found one!
            return true;
        }
    }   
    // return false if no files were found
   return false;
}
3 голосов
/ 22 июля 2015
<!DOCTYPE html>
<html>
<body>

<form action="#" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input name="my_files[]" type="file" multiple="multiple" />
    <input type="submit" value="Upload Image" name="submit">
</form>


<?php

 if (isset($_FILES['my_files']))
  {
    $myFile = $_FILES['my_files'];
    $fileCount = count($myFile["name"]);


        for ($i = 0; $i <$fileCount; $i++)
         {
           $error = $myFile["error"][$i]; 

            if ($error == '4')  // error 4 is for "no file selected"
             {
               echo "no file selected";
             }
            else
             {

               $name =  $myFile["name"][$i];
               echo $name; 
               echo "<br>"; 
               $temporary_file = $myFile["tmp_name"][$i];
               echo $temporary_file;
               echo "<br>";
               $type = $myFile["type"][$i];
               echo $type;
               echo "<br>";
               $size = $myFile["size"][$i];
               echo $size;
               echo "<br>";



               $target_path = "uploads/$name";   //first make a folder named "uploads" where you will upload files


                 if(move_uploaded_file($temporary_file,$target_path))
                  {
                   echo " uploaded";
                   echo "<br>";
                   echo "<br>";
                  }
                   else
                  {
                   echo "no upload ";
                  }




              }
        }  
}
        ?>


</body>
</html>

см. http://www.techzigzag.com/how-to-check-that-user-has-upload-any-file-or-not-in-php/

Но будь начеку. Пользователь может загрузить любой тип файла, а также может взломать ваш сервер или систему, загрузив вредоносный или php-файл. В этом скрипте должны быть некоторые проверки. Спасибо.

2 голосов
/ 16 марта 2017

Вы должны использовать $_FILES[$form_name]['error']. Возвращает UPLOAD_ERR_NO_FILE, если файл не был загружен. Полный список: PHP: Объяснение сообщений об ошибках

function isUploadOkay($form_name, &$error_message) {
    if (!isset($_FILES[$form_name])) {
        $error_message = "No file upload with name '$form_name' in form.";
        return false;
    }
    $error = $_FILES[$form_name]['error'];

    // List at: http://php.net/manual/en/features.file-upload.errors.php
    if ($error != UPLOAD_ERR_OK) {
        switch ($error) {
            case UPLOAD_ERR_INI_SIZE:
                $error_message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini.';
                break;

            case UPLOAD_ERR_FORM_SIZE:
                $error_message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.';
                break;

            case UPLOAD_ERR_PARTIAL:
                $error_message = 'The uploaded file was only partially uploaded.';
                break;

            case UPLOAD_ERR_NO_FILE:
                $error_message = 'No file was uploaded.';
                break;

            case UPLOAD_ERR_NO_TMP_DIR:
                $error_message = 'Missing a temporary folder.';
                break;

            case UPLOAD_ERR_CANT_WRITE:
                $error_message = 'Failed to write file to disk.';
                break;

            case UPLOAD_ERR_EXTENSION:
                $error_message = 'A PHP extension interrupted the upload.';
                break;

            default:
                $error_message = 'Unknown error';
            break;
        }
        return false;
    }

    $error_message = null;
    return true;
}
2 голосов
/ 31 июля 2014

Я проверил ваш код и думаю, что вы должны попробовать это:

if(!file_exists($_FILES['fileupload']['tmp_name']) || !is_uploaded_file($_FILES['fileupload']['tmp_name'])) 
    {
        echo 'No upload';
    }   
    else
        echo 'upload';
1 голос
/ 13 апреля 2015

is_uploaded_file() отлично подходит для использования, особенно для проверки, является ли это загруженным файлом или локальным файлом (в целях безопасности).

Однако, если вы хотите проверить, загрузил ли пользователь файл, используйте $_FILES['file']['error'] == UPLOAD_ERR_OK.

См. Руководство PHP по сообщениям об ошибках загрузки файла . Если вы просто хотите проверить отсутствие файла, используйте UPLOAD_ERR_NO_FILE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...