2010-06-10 86 views
1

我有一个可以下载的excel文件..例如NAME.xlsx,它可以在Firefox中使用,但是在webkit(safari/chrome)中,它也可以附加名称扩展名.xhtml所以它命名将NAME.xlsx.html应该ONLY的.xlsxWebkit和Excel文件(PHPexcel)

在这里,你有我的头:

  $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); 

所以我做错了吗?

+1

你为什么要设置'content-type'三次?你可以尝试只使用'octet-stream'吗? – 2010-06-10 22:45:19

+0

现在它只增加了名称(1).html..before是.xhtml – Uffo 2010-06-10 22:59:54

回答

4

我还没有这个功能失败 - 它适用于我迄今为止在Safari(Windows)和Chrome上尝试过的所有Office 2007/2010文件。 get_known_mime_types()函数只是返回一个由我的应用程序支持的所有MIME类型的巨大数组 - 只是Google针对您需要的MIME类型。 $file是主机上文件的实际路径,$name是在下载(运行/保存)对话框中显示的文件名。我也给予了我从中获得最多的地方应有的荣誉。希望你也有幸运:

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兄弟,它的工作! – Uffo 2010-06-10 23:37:11

+0

不客气 - 我花了至少两个月才找到那篇文章,然后让其余部分工作。我很乐意分享这些财富。 – 2010-06-11 00:22:20

相关问题