Ti consiglio di usare il codice che hai postato tu, perché usa le funzioni is_uploaded_file() e move_uploaded_file(), che se ricordo bene sono più sicure :P
Riguardo all'errore, sei sicuro che la la path in cui cerca di inserire il file sia quella giusta? Al limite per controllarla metti il codice seguente subito prima della riga che contiene anche il messaggio di errore:
echo $upload_dir/$file_name;