Beh per forza te lo pubblica lo stesso, i vari blocchi IF con cui effettui i controlli sono slegati tra loro, e sono separati dall'istruzione che copia il file. Il risultato e' che i controlli vengono effettuati, ma non bloccano la copia del file. Prova cosi':

codice:
<?
$dir = "dir";
if ($file != "") {

$ext = strrchr($file_name,'.');
if (($extlimit == "yes") && (!in_array($ext,$limitedext))) {
$msg = "Il file che stai pubblicando non ha un'estensione corretta.";
}

else if (file_exists("$absolute_path/$file_name")) {
$msg = "C'è già un file con lo stesso nome";
}

else if (($sizelimit == "yes") && ($file_size > $sizebytes)) {
$msg = "Il file è troppo grande. Deve essere di $sizebytes bytes o meno.";
}

else @copy($file, "$absolute_path/$file_name") or die("Il file che stai pubblicando non può essere copiato sul server");

} else {
$msg = "Devi selezionare un file da pubblicare";
}
?>