codice:
	if(!function_exists('mime_content_type')) {
  function mime_content_type($f) {
    $f = escapeshellarg($f);
    return trim( `file -bi $f` );
  }
}
function download($file) {
  if((file_exists("upload/{$file}")) && (is_readable("upload/{$file}"))) {
    $filecontents = implode("", file("upload/{$file}"));
    $type = mime_content_type("upload/".$file);
    $size = filesize("upload/{$file}");
    header("Content-Type: {$type}");
    header("Content-Disposition: attachment; filename=\"{$file}\"");
    header("Content-Length: {$size}");
    header("Content-Transfer-Encoding: binary");
    echo $filecontents;
    exit(0);
  }
}
 
usalo così:
$file = "tuofile.ext";
download($file);
non devi outputtare niente prima, senò non va.
Ciao!