How to check if a file was selected in the input field?

2

I do a form validation to ensure that the file a user uploaded is the right type. But the upload is optional, so I want to ignore the validation if it did not upload anything and sent the rest of the form. How can I check if it has loaded something or not in <input name="file-upload[]" type="file" multiple="multiple" /> ?

My HTML form:

<form action="test.php" method="post" enctype="multipart/form-data">
  Envie esses arquivos:<br />
  <input name="file-upload[]" type="file" multiple="multiple" /><br />
  <input type="submit" value="Enviar arquivos" />
</form>

How do I validate the backend to see if it has loaded something into the input for files?

Is it with is_uploaded_file ()? Or with isset? Or with empty ? Or do you have to check the error code? Because even by not selecting comes the empty file-upload array.

    
asked by anonymous 20.11.2017 / 17:59

2 answers

4

is_uploaded_file is not used for this is used to check if something past has been uploaded, assuming you have created a function for eg check the last modification of the file, using filemtime , but it can not be an upload file, so you would do something like:

function my_file_mtime($input)
{
     if (is_uploaded_file($input)) {
          return false;
     }

     return filemtime($input);
}

And the case would use it like this:

var_dump(my_file_mtime('foo/bar/baz.txt')); // retorna um numero, por exemplo int(10), supondo que o arquivo tenha o peso de 10 bytes

var_dump(my_file_mtime($_FILES['file-upload']['tmp_name'])); //Retorna false

This is just to explain a possible use of is_uploaded_file , which for your doubt, is not what you need .

Now returning to the problem, what you want is to verify that the FORM input has been filled, so isset and / or empty will serve you in this, because PHP generates the variables as needed, in the if !empty() is going to be more practical, in addition to checking if the super global variable ( $_FILES ) was generated it, thus:

if (empty($_FILES['file-upload']['name'])) {
    echo 'Você não selecionou nenhum arquivo';//Aqui você pode trocar por um alert ou customizar como desejar, é um aviso que o usuário provavelmente não selecionou nada
} else {
    $arquivos = $_FILES['file-upload'];
    $total = count($arquivos['name']);

    for ($i = 0; $i < $total; $i++) {
        //Ação do upload para cada arquivo adicionado com "[]"
    }
}

In general this already solves a good part, even if the user selected something, but still there is the error checking that is explained in this link:

  

Error Messages Explained

These are constants that you can use to know what error occurred while uploading the file:

  • UPLOAD_ERR_OK there was no error, the upload was successful.

  • UPLOAD_ERR_INI_SIZE The uploaded file exceeds the limit set in the php.ini upload_max_filesize directive.

  • UPLOAD_ERR_FORM_SIZE The file exceeds the limit defined in MAX_FILE_SIZE in the HTML form.

  • UPLOAD_ERR_PARTIAL The upload was partially done.

  • UPLOAD_ERR_NO_FILE No files have been uploaded.

  • UPLOAD_ERR_NO_TMP_DIR Temporary folder is missing. Introduced in PHP 5.0.3.

  • UPLOAD_ERR_CANT_WRITE Failed to write file to disk. Introduced in PHP 5.1.0.

  • UPLOAD_ERR_EXTENSION A PHP extension has stopped uploading the file. PHP does not provide a way to determine which extension caused the interrupt. Examining the list of extensions loaded with phpinfo () can help. Introduced in PHP 5.2.0.

Just compare these constants with $_FILES['file-upload']['error'] and in your case how you used [] , you should use $_FILES['file-upload']['error'][$index] ( $index would be the iterator of for , it's just an example, in case it's a same thing as $i I used in the example above)

A simple example would be to check only if it is different from UPLOAD_ERR_OK , like this:

if (empty($_FILES['file-upload']['name'])) {
    echo 'Você não selecionou nenhum arquivo';//Aqui você pode trocar por um alert ou customizar como desejar, é um aviso que o usuário provavelmente não selecionou nada
} else {
    $arquivos = $_FILES['file-upload'];
    $total = count($arquivos['name']);

    for ($i = 0; $i < $total; $i++) {
        $nome = $arquivos['name'][$i];

        if ($arquivos['error'][$i] !== UPLOAD_ERR_OK) {
            echo 'Erro ao fazer upload de ', htmlspecialchars($nome), '<br>';
            continue;
        }

        if (move_uploaded_file($arquivos['tmp_name'][$i], 'pasta/foo/bar/' . $nome)) {
            echo 'O arquivo ', htmlspecialchars($nome),' foi carregado<br>';
        } else {
            echo 'O arquivo ', htmlspecialchars($nome),' não foi carregado<br>';
        }
    }
}

You can also enter the detailed error message for the user:

function mensagem_de_erro($code) {
    switch ($code) {
        case UPLOAD_ERR_OK: //Se o upload for OK ele retorna false
            return false;
        case UPLOAD_ERR_INI_SIZE:
            return 'O upload excedeu o limite máximo definido no upload_max_filesize no php.ini';
        case UPLOAD_ERR_FORM_SIZE:
            return 'O upload excedeu o MAX_FILE_SIZE especificado no formulário HTML';
        case UPLOAD_ERR_PARTIAL:
            return 'O upload foi parcial';
        case UPLOAD_ERR_NO_FILE:
            return 'Não foi selecionado um arquivo';
        case UPLOAD_ERR_NO_TMP_DIR:
            return 'A pasta temporária não foi definida (php.ini) ou não é acessivel';
        case UPLOAD_ERR_CANT_WRITE:
            return 'Não pode fazer o upload na pasta temporaria';
        case UPLOAD_ERR_EXTENSION:
            return 'O upload foi interrompido por uma extensão PHP';
        default:
            return 'Erro desconhecido';
    }
}

if (empty($_FILES['file-upload']['name'])) {
    echo 'Você não selecionou nenhum arquivo';//Aqui você pode trocar por um alert ou customizar como desejar, é um aviso que o usuário provavelmente não selecionou nada
} else {
    $arquivos = $_FILES['file-upload'];
    $total = count($arquivos);

    for ($i = 0; $i < $total; $i++) {
        $nome = $arquivos['name'][$i];

        $erro = mensagem_de_erro($arquivos['error'][$i]);

        if ($erro) {
            echo $erro, ' - arquivo: ', htmlspecialchars($nome), '<br>';
            continue; //Pula o item atual do array para o proximo se algo falha no atual
        }

        if (move_uploaded_file($arquivos['tmp_name'][$i], 'pasta/foo/bar/' . $nome)) {
            echo 'O arquivo ', htmlspecialchars($nome),' foi carregado<br>';
        } else {
            echo 'O arquivo ', htmlspecialchars($nome),' não foi carregado<br>';
        }
    }
}
    
20.11.2017 / 20:30
2

1 - You will not load with form , form will only force the submission to some script server-side (PHP) to do upload , in this case, you would receive in PHP and would put the file somewhere with move_uploaded_file() (there are other possibilities¹):

Example taken from official documentation :

$uploaddir = '/pasta/para/upload';
$uploadfile = $uploaddir . basename($_FILES['file-upload']['name']);


if (move_uploaded_file($_FILES['fil-eupload']['tmp_name'], $uploadfile)) {
    echo "Se o arquivo pode ser movido para a pasta informada essa será a resposta.\n";
} else {
    echo "Caso o arquivo não tenha sido carregado para a pasta informada esta a resposta!\n";
}

Now, since you have [] in file-upload , it means that you want to send more than one file, follow the adapted example from the previous example:

//Diretório para upload
$uploaddir = '/pasta/para/upload';
//Salva os arquivos enviados em uma váriavel $files
$files = $_FILES['file-upload'];

//Inicia um contador (apenas para dizer em qual linha foram as respostas)
$a = 0;
//Verificando se existe algum alguma coisa em $files
if (isset($files)) {

    $name = $files['name'];
    $tmp_name = $files['tmp_name'];
    //Passando um loop por $files
    foreach ($name as $file) {
        //Definindo um diretório para o arquivo ser carregado
        $uploadfile = $uploaddir . basename($name[$a]);
        //Verificando se o arquivo pode ser carregado
        if (move_uploaded_file($tmp_name[$a], $uploadfile)) {
            echo "O arquivo $a foi carregado<br>";
        } else {
            echo "O arquivo $a não foi carregado";
        }
        //Somando ao contador
        $a += 1;
    }
} else {
    echo 'Nenhum arquivo foi enviado';
}

¹ - Possibilities to upload:

is_uploaded_file

move_uploaded_file

ftp_put - Requires open FTP connection.

    
20.11.2017 / 19:26