Certo che è un problema!
Una volta richiamata la funzione, gli headers vengono inviati e quindi non si possono modificare.
Puoi risolvere in vari modi, io ti consiglio di creare una pagina php, la chiami download.php che scarica un file in base al parametro file che viene passato via GET. In un altra pagina estrai i dati dalla tabella e crei i link per scaricare.
In breve, questa è la pagina dove estrai i dati:
Codice PHP:
require('config.php');
// Se non è stata definita la variabile manda l'utente alla homepage
if(!isset($_SESSION['login']))
{
header('Location: indexx.php');
exit;
}
$con = mysql_connect("localhost","web01","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_web01", $con);
$getid=$_GET['id'];
$result = mysql_query("SELECT * FROM upload where id='$getid'");
while($row = mysql_fetch_array($result))
{
$file = $row['percorso'];
echo "<a href=\"download.php?file={$file}\">Scarica {$file}</a><br />";
}?>
E la pagina download.php
Codice PHP:
function download($file) {
$file = realpath($file);
if(headers_sent()) {
echo "Headers già inviati!";
return false;
} else if(!file_exists($file)) {
echo "Il file da scaricare è inesistente!";
return false;
}
$mime_types = array(
"bmp" => "image/bmp",
"exe" => "application/octet-stream",
"html" => "text/html",
"ico" => "image/x-icon",
"jpeg" => "image/jpeg",
"png" => "image/png",
"jpg" => "image/jpeg",
"mov" => "video/quicktime",
"mp3" => "audio/mpeg",
"mp4" => "video/mpeg",
"mpeg" => "video/mpeg",
"mpg" => "video/mpeg",
"txt" => "text/plain",
"wav" => "audio/x-wav",
"zip" => "application/zip"
);
$bytes = filesize($file);
$info = pathinfo($file);
$ext = strtolower($info["extension"]);
$mt = isset($mime_types[$ext]) ? $mime_types[$ext] : "application/octet-stream";
header("Content-Transfer-Encoding: binary");
header("Content-Type: {$mt}");
header("Content-disposition: attachment; filename=" . $info["filename"] . "." . $info["extension"]);
header("Content-length: {$bytes}");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
return readfile($file);
}
if(isset($_GET["file"])) {
$file = str_replace(array(".", ".."), null, $_GET["file"]);
download($file);
}