In Content-Type manca il nome del file.
Mancano alcuni header che IE (se usi IE) richiede.
Passa il file con percorso assoluto.

Io uso qualcosa di questo tipo (forzo il download di ZIP o PDF):

Codice PHP:
//$File: percorso [b]assoluto[/b] + nomefile del file da inviare al browser
//$OPZNomeFile: nome del file (se diverso da quello con cui il file è immagazzinato sul filesystem del server)
function force_download($File$OPZNomeFile)
  {
  
$dim filesize($File);

  
// Posso forzare un nome diverso da per il file da inviare al browser
  
if ($OPZNomeFile==""$NomeFile substr($File,strrpos($File,"/")+1,strlen($File));
  else 
$NomeFile $OPZNomeFile;

  
$estensione strtolower(substr($NomeFile,strrpos($NomeFile,".")+1,strlen($File)));

  if (
$estensione == "pdf"$apptype "application/pdf";
  else if (
$estensione == "zip"$apptype "application";
  else 
$apptype "application/force-download";

  
// Forza il download via HTTP + APERTURA
  
header("Content-Type: ".$apptype."; name=".$NomeFile);
  
header("Content-Transfer-Encoding: binary");
  
header("Content-Length: ".$dim);
  
header("Content-Disposition: attachment; filename=".$NomeFile);
  
header("Expires: 0");
  
header("Cache-Control: no-cache, must-revalidate");
  
header("Cache-Control: private");
  
header("Pragma: public");
  
readfile($File);
  }