terça-feira, 5 de novembro de 2024

Enviar mensagem amigável ao usuário trabalhando com as opções do php.ini

O PROBLEMA

   O problema resume-se em enviar uma mensagem amigável de “Este arquivo excede o tamanho permitido” (ou algo parecido) quando se permite upload via POST de determinados arquivos na aplicação/site em PHP porque o PHP não possui um tipo ‘unknown’.

   A diretiva do arquivo php.ini ‘upload_max_filesize’ define o tamanho máximo de arquivo que um usuário pode enviar, enquanto ‘post_max_size’ define a quantidade máxima de dados que podem ser enviados por meio de um POST em um formulário.

   Por exemplo, você pode definir ‘upload_max_filesize’ como 1 megabyte no php.ini, o que significa que o maior arquivo único que um usuário enviará terá 1 megabyte, porém, esse usuário pode enviar 5 arquivos de 1 megabyte se ‘post_max_size’ estiver definido como 5 megabytes.

   Lembrando que, para permitir upload de vários arquivos ao mesmo tempo, é preciso adicionar a propriedade “multiple” ao elemento input no HTML:


<input type=”file” id=”meuinput” multiple>

   As diretivas ‘file_uploads’ e ‘max_file_uploads’ devem estar configuradas no php.ini.

   Os códigos dos arquivos estão na seção "A Solução".

   Nível Intermediário.

   Primeiro veremos as diretivas do php.ini:


- file_uploads = On (Permite uploads de arquivos HTTP);
- max_file_uploads = 10 (Número máximo de arquivos que podem ser enviados em uma única requisição);
- post_max_size = 2M (Tamanho máximo dos dados POST que o PHP aceitará, valor "0" (zero) desabilita o limite. É ignorada se a leitura dos dados POST está desabilitada por meio de ‘enable_post_data_reading = Off’, ou seja, para post_max_size funcionar, ‘enable_post_data_reading’ deve estar no padrão (comentada) ou descomentada com On;
- enable_post_data_reading = On;
- upload_max_filesize = 2M (Tamanho máximo permitido para envio de um arquivo).


   Algumas vezes, caso use FCGID com Apache (FPM/FASTCGI), Nginx, etc, tem de se alterar também os arquivos nesses programas para não dar ERRO 500, 413, 400, etc. Por exemplo, no Apache em algumas distribuições Linux tem de se alterar o arquivo /etc/apache2/mods-available/fcgid.conf (ou num vhost.conf) acrescentando uma linha assim: "FcgidMaxRequestLen 10485760" (10M) tendo o cuidado de deixar esse valor com o mesmo valor de ‘upload_max_filesize’ no php.ini.

   É que o limite para o tamanho do corpo da requisição HTTP estabelecido pelo módulo FastCGI costuma ser de 128 KBytes (131072 bytes) no Apache e 1M no Nginx, o que afeta o tamanho do arquivo para upload com POST, já que o mesmo é enviado no corpo da requisição.

Apache:

Nginx:

   Para fins de informação, na RFC 9110 na seção “18.3. Status Code Registration” tem os códigos 1XX, 2XX, 3XX, 4XX e 5XX.


   O PHP não capta o tamanho do arquivo da aplicação/site quando as diretivas ‘post_max_size’ e ‘upload_max_filesize’ estiverem setadas no php.ini para menos do que o tamanho do arquivo enviado (o que sempre acontecerá, pois é isso mesmo que queremos: limitar o tamanho do upload), porém, o PHP “pega” o tamanho do arquivo no cabeçalho da solicitação HTTP quando esta chega no servidor.

   Por exemplo: quero enviar uma mensagem ao usuário de que o arquivo excedeu o tamanho permitido de upload para determinada aplicação/site, sendo que as diretivas ‘post_max_size’ e ‘upload_max_filesize’ estão setadas em 2M e o usuário tenta enviar um arquivo de 10M; neste caso, a mensagem de “O arquivo excede o limite...” não será exibida com um código simples porque a variável $_FILES[‘arquivo’][‘size’] vem igual a NULL e isso acontece porque o PHP é executado no servidor.

  Outro exemplo: caso as diretivas no php.ini estiverem em 10M e o usuário envia um arquivo de 15M, a mensagem não é exibida porque $_FILES[‘arquivo’][‘size’] vem igual a NULL da mesma maneira.

   Para exibir a mensagem devem-se aumentar as diretivas, porém, isso representa uma incongruência e uma possível falha de segurança, pois, estou permitindo no php.ini, uploads maiores do que o desejado e/ou do que o servidor suporta no conjunto das requisições feitas por vários clientes e, muitas vezes, ao mesmo tempo.

   Além disso, para quanto deve-se aumentar as diretivas?

   Não se sabe o tamanho do arquivo ou quantos arquivos um usuário mal intencionado tentará enviar. Alguns colocam um .htaccess no Apache e em conjunto aumentam as diretivas, porém, não é uma boa prática. Aliás, o próprio Apache e o Nginx desaconselham o uso de tal arquivo. O .htaccess é aconselhado somente onde tenha vários usuários do mesmo servidor web, como, por exemplo, um provedor VPS... e ainda assim com restrições.

   Para quem tenha interesse, deixo aqui um conversor htaccess para Nginx:

https://winginx.com/en/htaccess

   Quando o arquivo é maior do que o permitido e não foram feitas as configurações necessárias, aparece no navegador aquela mensagem padrão do servidor web como, por exemplo, a mensagem do Nginx:

413 Request Entity Too Large nginx/1.10.3” (A entidade solicitada é muito grande), mensagem esta ininteligível para o usuário.

https://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/

   Vamos a um exemplo no caso que nos interessa.

   Considerando o seguinte trecho de código abaixo, que está comentado no código da próxima página, mas utilizei para teste:

var_dump($_FILES[‘arquivo’][‘size’]);
$arquivo = $_FILES[‘arquivo’];
switch($arquivo) {
    case ($arquivo[‘size’] > (2097152)): //2MB
        echo “Este arquivo excede o tamanho de 2MB!”;
    break;
}

   Enviando um arquivo maior do que o limite setado no php.ini gerou o seguinte aviso:

Warning: Undefined array key “arquivo” in /var/www/html/testup/upload.php on line 62

   E o “var_dump($_FILES[‘arquivo’][‘size’]);” gerou o seguinte:

/var/www/html/testup/upload.php:62:null

   E enviando um arquivo dentro do limite, no caso um arquivo com 312,4KB, gerou somente o var_dump, o que é óbvio:

/var/www/html/testup/upload.php:62:int 319925

   No caso da diretiva ‘upload_max_file_size’ estar setada no php.ini em, por exemplo, 10M, se o usuário enviar um arquivo de 15M o PHP não exibe a mensagem porque a variável $arquivo[‘size’] vem como NULL.

   Com ‘if else’ acontece a mesma coisa (entre ‘if else’ e ‘switch’ procuro sempre utilizar quando possível o ‘switch’, pois a diferença de desempenho em relação ao ‘if else’ é muito melhor e bem mais rápido).

   E caso você colocar no código:

case ($arquivo[‘size’] > (10485760)): //10MB

ainda assim o PHP não enviará mensagem e permitirá uploads via POST até o limite permitido no php.ini, no caso, 10MB.

   Alguns aumentam os limites para 100MB ou mais para poder enviar mensagem ou para evitar o “Warning” do PHP. Contudo, aumentar os limites para 100MB, por exemplo, permitirá que um usuário mal intencionado burle o HTML e envie arquivos com 100MB podendo saturar e travar o servidor, pois você mesmo configurou o PHP para aceitar uploads de 100MB.

   Lembrando que a diretiva 'max_file_uploads' (número máximo de arquivos que podem ser enviados em uma única requisição) vem com 20 como padrão, ou seja, 20 arquivos de 100MB são 2GB de upload, isso somente de um cliente.

   Setando agora o ‘upload_max_filesize’ em 2.5MB e o ‘post_max_size’ em 2MB, o ‘var_dump($bytesup);’ nos diz que a conversão está sendo feita (veja a função de conversão no código ao final do texto):

/var/www/html/testup/upload.php:51:float 2621440 //2.5MB

   A questão é que por estarem setados os parâmetros no php.ini (e não pode ser diferente), eles vem como NULL quando o arquivo enviado excede o tamanho permitido. Quando se clica no botão “Enviar”

<input type=”submit” name=”enviar_arquivo” value=”Enviar”>

depois de selecionado um arquivo maior do que 2.5MB, no caso um arquivo de 8.3MB, temos no var_dump($value):

/var/www/html/testup/upload.php:53: array(size=1) 0 => string ‘8716100’(length=7)

que gerará no PHP o seguinte aviso:

Warning: POST Content-Length of 8716100 bytes exceeds the limit of 2097152 bytes in Unknown on line 0

que nos diz que o Content-Length – tamanho do arquivo selecionado – excede o limite em ‘upload_max_filesize’.

   Sabemos que é em ‘upload_max_filesize porque a variável $uploadmaximo recebe o valor de ini_get(‘upload_max_filesize’) para a conversão, além do que, como foi falado antes, o ‘upload_max_filesize’ está em 2.5MB e o ‘post_max_size’ em 2MB

   A questão agora é que o PHP só identifica o tamanho do arquivo enviado pelo HTTP quando a solicitação chega (o que é óbvio, pois o PHP é executado no servidor) e também porque o PHP não tem um tipo ‘unknown’, somente um tipo ‘mixed’.

   Pode se configurar o HTML para restringir os uploads com um input hidden (escondido) e um input que restringe para aceitar somente PDF:

<input type=”hidden” name=”MAX_FILE_SIZE” value=”2097152”>

<input type=”file” name=”arquivo” id=”arquivo” class=”inputfile inputfile-1” accept=”application/pdf,.pdf”>

   Porém, o HTML pode ser burlado mais facilmente do que o PHP, mas é obrigatório fazer as sanitizações tanto no cliente quanto no servidor.

   A estilização em CSS, caso for colocar em produção os arquivos, aconselho a colocar num arquivo CSS em separado e não deixar inline como está. Aliás, sugiro fortemente nunca colocar CSS nem Javascript inline no HTML.

   Para resolver o problema de enviar uma mensagem amigável, vamos aos códigos.


A SOLUÇÃO

   Uma solução para enviar mensagens ao usuário informando que o arquivo excede o limite permitido, além de outras mensagens (no caso de ser enviado por POST), é a seguinte, que, no caso em específico, estamos permitindo somente upload de arquivo PDF até 2MB de tamanho, mas você pode adaptar para suas necessidades.

   E a questão também não é somente enviar a mensagem, mas fazer as verificações necessárias. No código PHP adiante foi utilizada a biblioteca PDFParser (sem Composer) para extrair o conteúdo do arquivo PDF e fazer algumas verificações, porém, você pode usar outra ou adaptar para as suas conveniências.


   O CSS das mensagens está embutido no PHP; o CSS do HTML está embutido no HTML. Fiz umas perfumarias com as mensagens, mas você pode desfazê-las e/ou modificar de acordo com as suas preferências.

   Ao clicar em “Selecione um arquivo” abrirá a janela para escolher o arquivo no sistema e depois de selecionado, o nome do arquivo aparecerá no lugar de “Selecione um arquivo”. Clicando em “Enviar”, o arquivo será enviado e aparecerá a respectiva mensagem.

   Como não há uma maneira de indicar sem JavaScript se algum arquivo foi selecionado, a class=”no-js” na tag <html> é adicionada para que o script adiante (primeira tag <script>) possa saber se o Javascript está disponível no navegador e, caso não estiver, prevalecerá a aparência padrão da entrada do arquivo para fins de usabilidade.



index.html

<!DOCTYPE html>
<html lang="pt-br" class=”no-js”>
    <head>
        <title>Upload de Arquivos</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <!-- remove this if you use Modernizr -->
        <script>
            (function(e,t,n) {
                var r=e.querySelectorAll("html")[0];r.className=r.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2");
            }) (document,window,0);
        </script>
        <script>javascript:window.history.forward(0);</script>
        <script>
                if (window.history.replaceState) {
                    window.history.replaceState(null, null, window.location.href);
            }
        </script>
        <style>
            #tudo{
                margin-top:3%;
                alignment-adjust:middle;
                vertical-align:middle;
                text-align:center;/* "remédio" para o hack do IE */
            } 
            /* Esconde o input */
            input[type='file'] {
                /*display: none;*/
                width: 0;
                height: 0;
                opacity: 0;
            }
            /* Aparência que terá o seletor de arquivo */
            label {
                background-color: #3498db;
                border-radius: 5px;
                color: #fff;
                cursor: pointer;
                margin: 10px;
                padding: 6px 20px;
            }
            #enviar_arquivo{
                background-color:#00ff7f;
                border-color:#00ff7f;
                border-radius:5px;
                cursor: pointer;
            }
        </style>
    </head>

    <body>
        <div id="tudo" class="container">Upload de Arquivos<br>É permitido somente arquivo PDF com, no máximo, 2MB.<br>Arquivo PDF com texto e imagem, será lido somente o texto.<br><br>
            <!-- O tipo de encoding de dados, enctype, DEVE ser especificado abaixo -->
            <form id="form2" name="form2" enctype="multipart/form-data" action="upload.php" method="post">
                <!--O input hidden com MAX_FILE_SIZE deve preceder o campo input file-->
                <input type="hidden" name="MAX_FILE_SIZE" value="2097152"><!-- Setar "upload_max_filesize" no php.ini -->
                <!-- O Nome do elemento input determina o nome da array $_FILES accept="application/pdf" -->
                <!--input type="file" name="arquivo" id="arquivo" accept="application/pdf,.pdf"-->
                <input type="file" name="arquivo" id="arquivo" class="inputfile" accept="application/pdf,.pdf">
                <label for="arquivo">
                    <span>Selecione um arquivo</span>
                </label><br><br>
                <input type="submit" name="enviar_arquivo" id="enviar_arquivo" value="Enviar">
            </form>
        </div>
        <!--Fim div tudo-->
        <script src="./customiza.js"></script>
    </body>

</html>


   O arquivo customiza.js faz a troca dos dizeres “Selecione um arquivo” pelo nome do arquivo selecionado.

customiza.js

// Início
'use strict';
;( function ( document, window, index ) {
        var inputs = document.querySelectorAll( '.inputfile' );
        Array.prototype.forEach.call( inputs, function( input )
    {
        var label = input.nextElementSibling,
        labelVal = label.innerHTML;
        input.addEventListener( 'change', function( e ) {
            var fileName = '';
            if( this.files && this.files.length > 1 )
                fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
            else
                fileName = e.target.value.split( '\\' ).pop();
            if( fileName )
                label.querySelector( 'span' ).innerHTML = fileName;
            else
                label.innerHTML = labelVal;
        });
        // Firefox bug fix
        input.addEventListener( 'focus', function(){ input.classList.add( 'has-focus' ); });
        input.addEventListener( 'blur', function(){ input.classList.remove( 'has-focus' ); });
    });
}( document, window, 0 ));
//Fim


   O arquivo upload.php faz o trabalho pesado.

upload.php

<?php
if(!isset($_SESSION) || (session_status() == PHP_SESSION_NONE) || (session_status() !== PHP_SESSION_ACTIVE) || (session_id() === "" )) {
    session_start();
}
$_SESSION = array();
session_unset();
session_destroy();
require_once 'E:/www/Desenvolvimento/projetoMSG/pdfparser-master/pdfparser-master/alt_autoload.php';
$uploaddir = 'E:/www/Desenvolvimento/projetoMSG/upload/';
//require_once '/var/www/html/projetoMSG/pdfparser-master/pdfparser-master/alt_autoload.php';
//$uploaddir = '/home/debina/Desenvolvimento/projetoMSG/upload/';
//Sete os parâmetros 'post_max_size' e 'upload_max_filesize' com o mesmo valor no php.ini.
//Recebe o dado necessário do formulário:
$dados = filter_input(INPUT_SERVER,'CONTENT_LENGTH');
//$enviar = filter_input(INPUT_POST, 'enviar_arquivo', FILTER_UNSAFE_RAW);
//
//Função que converte string em bytes:
function convertToBytes($string) {
    $unit = strtoupper(substr($string, -1));
    $value = substr($string, 0, -1);
    switch($unit) {
        case 'K':
            return $value * 1024;
        case 'M':
            return $value * 1024 * 1024;
        case 'G':
            return $value * 1024 * 1024 * 1024;
        default:
        return $value;
    }
}
// Converte a string 'XM' (X é um número) do php.ini em bytes usando a função convertToBytes:
$uploadmaximo = ini_get('upload_max_filesize');
$bytesup = convertToBytes($uploadmaximo);
//$postmaximo = ini_get('post_max_size');
//$bytespost = convertToBytes($postmaximo);
//Convertendo $dados para array:
$value = (array)$dados;
/*var_dump($_FILES['arquivo']['size']);*/
$arquivos = (!empty($_FILES['arquivo']));
switch($arquivos) {
    case (!empty($arquivos['size']) > (2097152)): //2MB
        echo "Este arquivo excede o tamanho de 2MB!";
    break;
}
//var_dump($uploadmaximo);
//var_dump($postmaximo).'<br>';
//var_dump($bytesup);
//var_dump($value);
//Selecionando o elemento desejado no array:
//$element = (array_values($value));
//Verifica se a variável $value está vazia e envia para a página inicial caso o usuário der um refresh na página:
if (empty($value[0])) {
    header("Location: index.html"); exit();
}
//Verifica se o tamanho do arquivo é superior ao limite do php.ini e envia mensagem:
if ($value[0] > $bytesup) {
    //echo "<p style='color: #f00;'>Este arquivo excede o tamanho de 2MB!</p>";
    include_once 'index.html';
    echo "<style>
        #tudo {
            animation:fadeInAnimation ease 2s;
            animation-iteration-count:1;
            animation-fill-mode:none;
        }
        @keyframes fadeInAnimation {
            0% {
                opacity:0;
            }
            50% {
                opacity:0;
            }
            100% {
                opacity:1;
            }
        }
        .captcentro{
            position:fixed;
            margin:0 auto;
            top:20.5%;
            left:50%;
            transform:translate(-50%, -50%);
            animation:hideAnimation 0s ease-in 4s;
            animation-fill-mode:forwards;
            border:2px solid #fff;
            padding:15px;
            background-color:#000000;
            border-radius:10px;
            font-size:20px;
            text-align:center;
            /*text-decoration:underline white;*/
        }
        @keyframes hideAnimation {
            to {
                visibility:hidden; width:0; height:0;
            }
        }
        @media only screen and (max-width:576px) {
            .captcentro{
                /*width:280px;*/
                position:fixed;
                margin:0 auto;
                top:19.5%;
                left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode:forwards;
                border:2px solid #fff;
                padding:10px;
                background-color:#000000;
                border-radius:10px;
                font-size:16px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility:hidden; width:0; height:0;
                }
            }
        }
    </style>";
    //header("Refresh: 0");
    echo "<div class='captcentro'><span style='color:red; font-size:20px;'><b>O arquivo excede o tamanho de 2MB!</b></span></div>";
    //header("Refresh: 0; url=pagina2.php");
    exit();
}
$arquivo = $_FILES['arquivo'];
//var_dump($arquivo);
//Verifica se o arquivo é PDF:
if (($arquivo['type'] === '.pdf') or ($arquivo['type'] === 'application/pdf') or ($value[0]) === ($value)) {
    //Captura a exceção da classe Parser do PDFParser e envia mensagem amigável ao usuário:
    try {
        $parser = new \Smalot\PdfParser\Parser(); //var_dump($parser);
        //$pdf = $parser->parseFile($_FILES['arquivo']['tmp_name']);
        $pdf = $parser->parseContent(file_get_contents($_FILES['arquivo']['tmp_name']));
        $text = $pdf->getText();
    }
    catch (Exception $e) {
        //echo "<p style='color: #f00;'>Este arquivo está corrompido, vazio ou protegido!<br>Tente outro arquivo.</p>";
        // $e->getMessage(), "\n";
        include_once 'index.html';
        echo "<style>
            #tudo {
                animation:fadeInAnimation ease 2s;
                animation-iteration-count:1;
                animation-fill-mode:none;
            }
            @keyframes fadeInAnimation {
                0% {
                    opacity:0;
                }
                50% {
                    opacity:0;
                }
                100% {
                    opacity:1;
                }
            }
            .captcentro{
                position:fixed;
                margin:0 auto;
                top:20.5%; left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode: forwards;
                border:4px solid #ffffff;
                padding:15px;
                background-color:#ffff00;
                border-radius:10px;
                font-size:20px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility: hidden; width:0; height:0;
                }
            }
            @media only screen and (max-width:576px) {
                .captcentro{
                    /*width:280px;*/
                    position:fixed;
                    margin:0 auto;
                    top:19.5%;
                    left:50%;
                    transform:translate(-50%, -50%);
                    animation:hideAnimation 0s ease-in 4s;
                    animation-fill-mode:forwards;
                    border:4px solid #ffffff;
                    padding:10px;
                    background-color:#ffff00;
                    border-radius:10px;
                    font-size:16px;
                    text-align:center;
                    /*text-decoration:underline white;*/
                }
                @keyframes hideAnimation {
                    to {
                        visibility:hidden;
                        width:0;
                        height:0;
                    }
                }
            }
        </style>";
        echo "<div class='captcentro'><span style='color:red;'><b>O arquivo está corrompido, vazio ou protegido!</b></span></div>";
        exit();
    }
    //Verifica se o arquivo foi enviado por POST:
    if (is_uploaded_file($_FILES['arquivo']['tmp_name'])) {
        if (!is_dir($uploaddir)) {
            mkdir($uploaddir);
        }
        $uploadfile = $uploaddir . ($_FILES['arquivo']['name']);
        $parser = new \Smalot\PdfParser\Parser();
        //var_dump($parser);
        //$pdf = $parser->parseFile($_FILES['arquivo']['tmp_name']);
        $pdf = $parser->parseContent(file_get_contents($_FILES['arquivo']['tmp_name']));
        $text = $pdf->getText();
        //echo $text;
        //Move o arquivo temporário para a pasta de destino:
        move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploadfile);
        //echo "<p style='color: #f00;'>O arquivo ". $_FILES['arquivo']['name'] ." foi enviado com sucesso!</p>\n<br><br>";
        require_once 'index.html';
        echo "<style>
            #tudo {
                animation:fadeInAnimation ease 2s;
                animation-iteration-count:1;
                animation-fill-mode:none;
            }
            @keyframes fadeInAnimation {
                0% {
                    opacity:0;
                }
                50% {
                    opacity:0;
                }
                100% {
                    opacity:1;
                }
            }
            .captcentro{
                position:fixed;
                margin:0 auto;
                top:20.5%;
                left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode:forwards;
                border:2px solid #ffffff;
                padding:15px;
                background-color:#ffd700;
                border-radius:10px;
                font-size:20px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility:hidden;
                    width:0;
                    height:0;
                }
            }
            @media only screen and (max-width:576px) {
                .captcentro{
                    /*width:280px;*/
                    position:fixed;
                    margin:0 auto;
                    top:19.5%;
                    left:50%;
                    transform:translate(-50%, -50%);
                    animation:hideAnimation 0s ease-in 4s;
                    animation-fill-mode:forwards;
                    border:2px solid #ffffff;
                    padding:10px;
                    background-color:#ffd700;
                    border-radius:10px;
                    font-size:16px;
                    text-align:center;
                    /*text-decoration:underline white;*/
                }
                @keyframes hideAnimation {
                    to {
                        visibility:hidden;
                        width:0;
                        height:0;
                    }
                }
            }
        </style>";
        echo "<div class='captcentro'><span style='color:red; font-size:20px;'><b>O arquivo ". $_FILES['arquivo']['name'] ." foi enviado com sucesso!</b></span></div>";
        exit();
    }
    exit();
}
//Verifica se o tamanho do arquivo é menor ou igual ao limite do php.ini e exibe mensagem:
if (($arquivo['size'] !== 0) or ($value[0]) === ($arquivo['size'])) {
    if (($arquivo['type'] !== '.pdf') or ($arquivo['type'] !== 'application/pdf')) {
        //echo "<p style='color: #f00;'>Este arquivo não é PDF!</p>"; include_once 'index.html’;
        echo "<style>
            #tudo {
                animation:fadeInAnimation ease 2s;
                animation-iteration-count:1;
                animation-fill-mode:none;
            }
            @keyframes fadeInAnimation {
                0% {
                    opacity:0;
                }
                50% {
                    opacity:0;
                }
                100% {
                    opacity:1;
                }
            }
            .captcentro{
                position:fixed;
                margin:0 auto;
                top:20.5%;
                left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode:forwards;
                border:2px solid #fff;
                padding:15px;
                background-color:#000000;
                border-radius:10px;
                font-size:20px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility:hidden; width:0; height:0;
                }
            }
            @media only screen and (max-width:576px) {
                .captcentro{
                    /*width:280px;*/
                    position:fixed;
                    margin:0 auto;
                    top:19.5%;
                    left:50%;
                    transform:translate(-50%, -50%);
                    animation:hideAnimation 0s ease-in 4s;
                    animation-fill-mode:forwards;
                    border:2px solid #fff;
                    padding:10px;
                    background-color:#000000;
                    border-radius:10px;
                    font-size:16px;
                    text-align:center;
                    /*text-decoration:underline white;*/
                }
                @keyframes hideAnimation {
                    to {
                        visibility:hidden;
                        width:0;
                        height:0;
                    }
                }
            }
        </style>";
        echo "<div class='captcentro'><span style='color:red;'><b>O arquivo não é PDF!</b></span></div>";
        exit();
    }
}
//Condição que chama o 'index.html' caso o usuário clicar no botão enviar sem selecionar arquivo:
if (($value[0]) !== ($arquivo['size'])) {
    header("Location: index.html");
    exit();
}


CONCLUSÃO

   Você pode (e deve) melhorar os arquivos e adaptá-los para as suas necessidades.
Em pesquisa na internet notei uma falta de artigos, tutoriais, etc, neste sentido de configurar mensagens em PHP após o envio de arquivos.
      A estilização em CSS, caso for colocar em produção os arquivos, aconselho a colocar num arquivo CSS em separado e não deixar inline como está.

   Enfim, deixo como mais uma sugestão de programação neste sentido.


Nenhum comentário:

Postar um comentário