Il tuo codice
Codice PHP:
<?php 
// connessione e selezione del database
mysql_connect('localhost''root''root')
or die(
'Connessione non riuscita: ' mysql_error());

if(!
mysql_select_db('utenti'))
die(
'Selezione database fallita!');

// query per recuperare il file
$query 'SELECT * FROM utenti.tabella_files WHERE id_file = '.$_GET['id'];
echo 
$query "
"

$risultato mysql_query($query) or die('Query non valida: ' mysql_error());
echo 
$risultato "
"
;
$tmp mysql_fetch_array($risultato);
echo 
$tmp "
"
;

// invio una intestazione contenente il tipo MIME
header('Content-Type: '$tmp['tipo_file']);
echo 
$tmp['tipo_file'];

// invio il contenuto del file
echo $tmp['dati_file'];

?>
ha un errore di fondo, ossia produrre dell'output con la echo prima della chiamata della funzione header. Gli header sono inviati non appena cerchi di produrre dell'output, ne consegue che all'istruzione echo $query . "
"; gli header partono, e la successiva chiamata della funzione header(), per impostare il content type, non ha alcun effetto. Subito dopo produci in output (come testo html) il contenuto binario del file immagine che recuperi dal DB.

Ripassa la funzione header
http://it.php.net/manual/en/function.header.php