2010-06-10 15 views
1

J'ai un fichier excel qui peut être téléchargé..par exemple NAME.xlsx ainsi il fonctionne dans firefox mais dans webkit (safari/chrome) il ajoute au nom aussi l'extension .xhtml nom si il sera NAME.xlsx.html il devrait être SEULEMENT .xlsxWebkit et fichier Excel (PHPexcel)

ici vous avez mes têtes:

  $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 

     $objWriter->save($root.'/application/to_excel/KSW.xlsx'); 
     $this->getResponse()->setHeader('Content-type', 'application/download', true); 
     $this->getResponse()->setHeader('Content-type', 'application/octet-stream', true);    
     $this->getResponse()->setHeader('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', true); 
     $this->getResponse()->setHeader('Content-disposition', 'attachment;filename='.basename($root.'/application/to_excel/KSW.xlsx').'', true); 
     $this->getResponse()->setHeader('Cache-Control', 'max-age=0', true); 

donc ce que je fais mal?

+1

Pourquoi définissez-vous trois fois le type de contenu? Pouvez-vous essayer d'utiliser le seul 'octet-stream'? –

+0

Maintenant, il ajoute seulement au nom (1) .html..avant était .xhtml – Uffo

Répondre

4

Cette fonction n'a pas encore échoué - elle fonctionne avec tous les fichiers Office 2007/2010 que j'ai essayés jusqu'à présent dans Safari (Windows) et Chrome. La fonction get_known_mime_types() retourne juste un tableau géant de tous les types mime que mon application supporte - juste Google pour les types MIME dont vous avez besoin. $file est le chemin d'accès réel au fichier sur votre hôte et $name est le nom de fichier qui s'affiche dans la boîte de dialogue de téléchargement (exécution/sauvegarde). J'ai aussi donné tout le crédit à l'endroit dont je l'ai tiré. J'espère que vous avez aussi de la chance:

function file_download($file, $name, $mime_type='') { 
    /* The majority of this code was taken from: 
    * http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/ 
    * 
    * So a big thanks to them. 
    * I have modified parts of it, though, so it's not 100% borrowed. 
    */ 

    if(!is_readable($file)) die('File not found or inaccessible!'); 

    $size = filesize($file); 
    $name = rawurldecode($name); 

    /* Figure out the MIME type (if not specified) */ 
    $known_mime_types = get_known_mime_types(); 

    if($mime_type==''){ 
     $file_extension = strtolower(substr(strrchr($file,"."),1)); 

     if(array_key_exists($file_extension, $known_mime_types)){ 
      $mime_type=$known_mime_types[$file_extension]; 
     } else { 
      $mime_type="application/force-download"; 
     } 
    } 

    @ob_end_clean(); //turn off output buffering to decrease cpu usage 

    // required for IE, otherwise Content-Disposition may be ignored 
    if(ini_get('zlib.output_compression')) { 
     ini_set('zlib.output_compression', 'Off'); 
    } 

    header('Content-Type: ' . $mime_type); 
    header('Content-Disposition: attachment; filename="'.$name.'"'); 
    header("Content-Transfer-Encoding: binary"); 
    header('Accept-Ranges: bytes'); 

    /* The three lines below basically make the download non-cacheable */ 
    header("Cache-control: private"); 
    header('Pragma: private'); 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

    // multipart-download and download resuming support 
    if(isset($_SERVER['HTTP_RANGE'])) { 
     list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
     list($range) = explode(",",$range,2); 
     list($range, $range_end) = explode("-", $range); 
     $range=intval($range); 

     if(!$range_end) { 
      $range_end=$size-1; 
     } else { 
      $range_end=intval($range_end); 
     } 

     $new_length = $range_end-$range+1; 

     header("HTTP/1.1 206 Partial Content"); 
     header("Content-Length: $new_length"); 
     header("Content-Range: bytes $range-$range_end/$size"); 
    } else { 
     $new_length=$size; 
     header("Content-Length: ".$size); 
    } 

    /* output the file itself */ 
    $chunksize = 1*(1024*1024); // 1MB, can be tweaked if needed 
    $bytes_send = 0; 

    if ($file = fopen($file, 'r')) { 
     if(isset($_SERVER['HTTP_RANGE'])) { 
      fseek($file, $range); 
     } 

     while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length)) { 
      $buffer = fread($file, $chunksize); 
      print($buffer); //echo($buffer); // is also possible 
      flush(); 
      $bytes_send += strlen($buffer); 
     } 

     fclose($file); 
    } else { 
     die('Error - can not open file.'); 
    } 

    die(); 
} 
+0

Thx mec, cela a fonctionné! – Uffo

+0

Vous êtes les bienvenus - il m'a fallu au moins deux mois pour trouver cet article et ensuite faire le reste du travail. Je suis heureux de partager cette richesse. –