Verifica form con php

di il
2 risposte

Verifica form con php

Buonasera a tutti: ho un problema che non riesco a risolvere: ho un form e un file PHP che deve controllare la dimensione del file allegato e la sua estensione. Succede una cosa stranissima: se il file è > 2 Mb, per esempio di 2,5 Mb, (con estensione ammessa ma anche con estensione non ammessa), non viene visualizzato alcun errore, la mail viene inviata ma arriva al destinatario senza allegato !
Se allego un file di 9 Mb, per esempio, la pagina WEB diventa bianca e tutto si blocca !
Sul mio server la dimensione massima del file che si possono scaricare impostata nel PHP.INI è di 2 Mb.

Qui di seguito in
codice del file PHP: Ringrazio anticipatamente quanti vorranno aiutarmi !!!!!

<?php

// --------------------------------- 5 DATI DA PERSONALIZZARE ---------------------------
// 1) destinatario della mail, oggetto della mail, riga di intestazione del corpo della mail,
// dimensione massima del file e tipi di files consentiti

$dest1 = $_COOKIE['destinatario'];
$dest2 = ".vg";
$sendTo = str_rot13($dest1.$dest2);
$oggetto = 'Ciao Marcello. Hai ricevuto un messaggio dal form dei contatti del tuo sito';
$oggetto2 = 'Ciao. Questa e\' la mail che hai inviato a ' .$sendTo;
$intestazione = 'Ciao Marcello, hai ricevuto il seguente messaggio dal form dei contatti del tuo sito';
$intestazione2 = 'Ciao. Questa e\' la mail che hai inviato a ' .$sendTo;
$maxfilesize = 2097152; // indicare la dimensione massima del file (1024=1 kb, 1048576=1Mb, 2097152=2Mb, 4194304=Mb etc.).
$extensions = array("gif","png","jpg","jpeg","pdf","zip","rar","doc","docx","xls","xlsx","odt","ods","rtf","txt"); //tipi di files consentiti.

if(!isset($_POST['privacy'])) { // se l'accettazione della privacy NON è stata fatta, allora esco (controllo ridondante)
exit();
}


// Recupero i valori dei campi del form
$nome = utf8_decode($_POST['name']); // utf8_decode è per supportare le lettere accentate
$cognome = utf8_decode($_POST['surname']);
$email = $_POST['email'];
$telefono = $_POST['phone'];
$messaggio = utf8_decode($_POST['message']);

// Memorizzo in variabili più leggibili le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];
$allegato_size = $_FILES['allegato']['size'];

// Inizializzo le variabili $headers, $msg e $msg2
$headers = "From: " . $email;
$msg = "";
$msg2 = "";


// SE E' STATO ALLEGATO UN FILE, verifico se esso è stato caricato correttamente via HTTP
if (is_uploaded_file($allegato))
{
// Apro in sola lettura e leggo il file allegato.
$file = fopen($allegato,'r');
$data = fread($file, filesize($allegato));
fclose($file);

// verifica che il tipo di file sia tra quelli consentiti
$file_ext=strtolower(end(explode('.',$allegato_name)));
if (in_array($file_ext,$extensions )=== false){
header('Location: ../../contact-form-error-file-type.html');
exit;
}


// verifica della dimensione del file
if ($allegato_size > $maxfilesize) {
unlink($allegato);
header('Location: ../../contact-form-error-file-too-big.html');
exit;
}


// Adatto il file al formato MIME base64 usando base64_encode
$data = chunk_split(base64_encode($data));

// Genero il "separatore". Serve per dividere, appunto, le varie parti del messaggio. Nel nostro caso separerà la parte testuale dall'allegato
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

// Aggiungo le intestazioni necessarie per l'allegato
$headers .= "\nMIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"{$mime_boundary}\"";

// Definisco il tipo di messaggio (MIME/multi-part)
$msg .= "This is a multi-part message in MIME format.\n\n";
$msg2 .= "This is a multi-part message in MIME format.\n\n";

// Metto il separatore
$msg .= "--{$mime_boundary}\n";
$msg2 .= "--{$mime_boundary}\n";

// Questa è la parte "testuale" della mail
$msg .= "Content-Type: text/plain; charset=utf-8\"\n";
$msg2 .= "Content-Type: text/plain; charset=utf-8\"\n";
$msg .= "Content-Transfer-Encoding: 7bit\n\n";
$msg2 .= "Content-Transfer-Encoding: 7bit\n\n";

$msg .= $intestazione . " (GUARDA ANCHE L'ALLEGATO):" . "\n\n";
if (isset ($_POST['ccn'])) {
$msg .= "Nota: il mittente HA CHIESTO di ricevere una copia di questa mail che ti ha inviato." . "\n\n";
} else {
$msg .= "Nota: il mittente NON ha chiesto di ricevere una copia di questa mail che ti ha inviato." . "\n\n";
}

$msg2 .= $intestazione2 . " (GUARDA ANCHE L'ALLEGATO):" . "\n\n";
$msg .= "Nome: " . $nome . "\n";
$msg2 .= "Nome: " . $nome . "\n";
$msg .= "Cognome: " . $cognome . "\n";
$msg2 .= "Cognome: " . $cognome . "\n";
$msg .= "Email: " . $email . "\n";
$msg2 .= "Email: " . $email . "\n";
$msg .= "Recapito telefonico: " . $telefono . "\n";
$msg2 .= "Recapito telefonico: " . $telefono . "\n";
$msg .= "Testo del messaggio: " . $messaggio . "\n";
$msg2 .= "Testo del messaggio: " . $messaggio . "\n";

// Metto il separatore
$msg .= "--{$mime_boundary}\n";
$msg2 .= "--{$mime_boundary}\n";

// Aggiungo l'allegato al messaggio
$msg .= "Content-Disposition: attachment; filename=\"{$allegato_name}\"\n";
$msg2 .= "Content-Disposition: attachment; filename=\"{$allegato_name}\"\n";
$msg .= "Content-Transfer-Encoding: base64\n\n";
$msg2 .= "Content-Transfer-Encoding: base64\n\n";
$msg .= $data . "\n\n";
$msg2 .= $data . "\n\n";

// chiudo con il separatore
$msg .= "--{$mime_boundary}--\n";
$msg2 .= "--{$mime_boundary}--\n";
}

// SE INVECE NON È STATO CARICATO ALCUN FILE, allora preparo un semplice messaggio testuale
else {
$msg .= $intestazione . ":" . "\n\n";
if (isset ($_POST['ccn'])) {
$msg .= "Nota: il mittente HA CHIESTO di ricevere una copia di questa mail che ti ha inviato." . "\n\n";
} else {
$msg .= "Nota: il mittente NON ha chiesto di ricevere una copia di questa mail che ti ha inviato." . "\n\n";
}
$msg2 .= $intestazione2 . ":" . "\n\n";
$msg .= "Nome: " . $nome . "\n";
$msg2 .= "Nome: " . $nome . "\n";
$msg .= "Cognome: " . $cognome . "\n";
$msg2 .= "Cognome: " . $cognome . "\n";
$msg .= "Email: " . $email . "\n";
$msg2 .= "Email: " . $email . "\n";
$msg .= "Recapito telefonico: " . $telefono . "\n";
$msg2 .= "Recapito telefonico: " . $telefono . "\n";
$msg .= "Testo del messaggio: " . $messaggio . "\n";
$msg2 .= "Testo del messaggio: " . $messaggio . "\n";
}


// Invio della mail
if (mail($sendTo, $oggetto, $msg, $headers))
{
header('Location: ../../contact-form-ok.html');
// echo "<p>Mail inviata con successo!</p>";
}else{
header('Location: ../../contact-form-error-send.html');
// echo "<p>Errore!</p>";
}

// Invio al mittente di una copia della mail inviata

if (isset ($_POST['ccn']))
{
$sendTo2 = $_POST['email'];
mail($sendTo2, $oggetto2, $msg2, $headers);
}

?>

2 Risposte

  • Re: Verifica form con php

    Essendo che i files che stai provando a caricare superano la dimensione impostata sulla configurazione PHP può darsi che lo script si blocchi e dia errore prima di arrivare al tuo controllo sulla dimensione fatto a mano, prova a mettere tutto dentro un try-catch in modo da capire se e quali errori ci sono...
    ps. controlla anche la sul php.ini la configurazione degli errori/warning/notice magari sono disattivati

    fammi sapere
  • Re: Verifica form con php

    Non sono molto esperto in php e il try-catch non so usarlo. Stavo pensando di delegare a javascript il controllo.
    Sono riuscito a inserire nell'html un piccolo javascript che calcola la dimensione del file.
    Ma mi sono bloccato (e non riesco a risolvere il problema) quando poi voglio aprire una finestra modale che avvisa dell'errore.
    la finestra modale non si apre !

    Qui l'html relativo alla finestra modale:
    <div id="modalxx"><div class="modal fade modalxx">
    <div class="modal-dialog modal-lg"><div class="modal-content"><div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
    <div class="evidenza">ERRORE !</div></div>
    <div class="modal-body"File troppo grande (max 2 Mb)</div>
    <div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">Chiudi</button></div>
    </div></div></div></div>

    Qui il Javascript:
    <script>
    $(document).ready(function () {
    $('#uploadBtn').change(function () {
    if (this.files.length > 0) { // verifica se il file (o i files) sono stati caricati
    $.each(this.files, function (index, value) { // loop per verificare ogni file caricato
    $filesize = Math.round(value.size / 1024 * 1000)// ricavo la dimensione del file in bytes
    if ($filesize > 2097152) // 1048576=1Mb, 2097152=2Mb, 4194304=4Mb, etc...
    {
    $('#modalxx').modal("show");};
    })
    }
    });
    });
    </script>
Devi accedere o registrarti per scrivere nel forum
2 risposte