Come abbiamo accennato precedentemente, l'utente richiederà un file cliccando su un link del tipo mostra.php?id=32, ovvero passerà ad un ulteriore script (mostra.php) l'ID del file di interesse. Il codice di seguito riportato si occupa proprio di gestire queste richieste. Niente di complicato: una volta recuperato l'ID del file in questione si tratta di effettuare una SELECT per estrarre il file e inviarne il risultato al browser.
Per permettere al browser di maneggiare correttamente il file dobbiamo far uso di una intestazione (header) contenente il corretto tipo MIME associato a tale file. Questa informazione è presente nel campo tipo_file della nostra tabella.
mostra.php
<?php
// connessione e selezione del database
mysql_connect('localhost', 'utente_db', 'password_db')
or die('Connessione non riuscita: ' . mysql_error());
if(!mysql_select_db('nome_database'))
die('Selezione database fallita!');
// query per recuperare il file
$query = 'SELECT * FROM tabella_files WHERE id_file = '.$_GET['id'];
$risultato = mysql_query($query) or die('Query non valida: ' . mysql_error());
$tmp = mysql_fetch_array($risultato);
// invio una intestazione contenente il tipo MIME
header('Content-Type: '.$tmp['tipo_file']);
// invio il contenuto del file
echo $tmp['dati_file'];
?>
Il funzionamento dello script si basa su 3 semplici passaggi: la query per il recupero del file il cui ID è conservato in $_GET['id'], l'invio dell'intestazione contenente il tipo MIME attraverso l'uso della funzione header, l'invio del file al browser con una semplice echo.
Nel caso in cui vogliamo che il browser non apra il file ma che proponga all'utente di salvarlo sul PC, ovvero che venga effettuato il download, allora al posto dell'intestazione:
header('Content-Type: '.$tmp['tipo_file']);
dovremo inviare le seguenti:
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$tmp[nome_file]\"");