Подтвердить что ты не робот

Как проверить, загрузил ли пользователь файл в PHP?

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

4b9b3361

Ответ 1

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

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

Из документов: Возвращает TRUE, если файл с именем:

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

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

EDIT: я использую это в своем классе 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;
}

Ответ 2

@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

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

Часть 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
    }
}

Ответ 4

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

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

Ответ 5

<!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 файл. В этом script должны быть некоторые проверки. Спасибо.

Ответ 6

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

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

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

Ответ 7

Вы должны использовать $_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;
}