2010-06-10 5 views
1

나는 엑셀 파일을 다운로드 할 수 있습니다. 예를 들어 NAME.xlsx는 파이어 폭스에서도 작동하지만 webkit (safari/chrome)에서는 이름에 확장자를 추가합니다 .xhtml 그래서 다음은 을해야 NAME.xlsx.html이 될 것입니다 이름 만 여기에 당신이 내 헤더가 .XLSX웹킷 및 엑셀 파일 (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'을 세 번 설정 했습니까? '옥텟 스트림'을 하나만 사용해 볼 수 있습니까? –

+0

이제는 이름 (1) .html..xhtml이 추가됩니다. – Uffo

답변

4

아직까지는이 기능이 실패하지 않았습니다. Safari (Windows) 및 Chrome에서 지금까지 사용해 본 모든 Office 2007/2010 파일에서 작동합니다. get_known_mime_types() 함수는 내 응용 프로그램에서 지원하는 모든 MIME 유형의 거대한 배열을 반환합니다. 필요한 MIME 유형 만 Google에서 지원합니다. $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

+0

당신은 환영합니다 - 그 기사를 찾아서 나머지 부분을 작동 시키는데 적어도 2 개월은 걸렸습니다. 나는 그 행복을 나눌 수있어서 행복합니다. –