ahhh, ese problema yo lo tuve hace tiempo y lo que descubri fue lo siguiente
Código PHP:
if (isset($_FILES['foto']['size']))
//si viene vacia es porque supera limite de POST_MAX_SIZE definido en php.ini
$error=$_FILES['foto']['error'];
//error 1 es cuando se supera el limite de UPLOAD_MAX_FILESIZE de php.ini
//error 2 es cuando se supera el limite de MAX_FILE_SIZE del formulario, si es que tiene
esos puntos para mi son CRITICOS porque ya estan fuera del alcance de la programacion que le des
ahi aplica en tu codigo, imprime las variables y ve que pasa....
saludos