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);
}
?>