Webkit和Excel文件(PHPexcel) [英] Webkit and Excel file(PHPexcel)

查看:99
本文介绍了Webkit和Excel文件(PHPexcel)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个可以下载的excel文件,例如NAME.xlsx,它可以在firefox中工作,但在webkit(safari / chrome)中,它也附加了扩展名.xhtml 然后命名它将是NAME.xlsx.html它应该是只有.xlsx



这里有我的标题:

  $ 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'真正);
$ this-> getResponse() - > setHeader('Cache-Control','max-age = 0',true);

那么我做错了什么?

解决方案

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

  function file_download($ file,$ name,$ mime_type =''){
/ *这段代码大部分是从
* http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/
*
*非常感谢他们。
*虽然修改了部分内容,但并非100%借用。
* /

如果(!is_readable($ file))死('文件未找到或无法访问!

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

/ *找出MIME类型(如果没有指定)* /
$ 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(); //关闭输出缓冲以减少cpu使用

// IE需要,否则Content-Disposition可能会被忽略
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');

/ *以下三行基本上使下载不可缓存* /
标头(Cache-control:private);
header('Pragma:private');
header(Expires:Mon,26 Jul 1997 05:00:00 GMT);

//多部分下载和下载恢复支持
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);
}

/ *输出文件本身* /
$ chunksize = 1 *(1024 * 1024); // 1MB,如果需要可以调整
$ 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); //回波($缓冲液); //也可以
flush();
$ bytes_send + = strlen($ buffer);
}

fclose($ file);
} else {
die('错误 - 无法打开文件。
}

die();
}


I have an excel file which can be downloaded..for example NAME.xlsx well it works in firefox but in webkit(safari/chrome) it appends to the name also the extension .xhtml so then name it will be NAME.xlsx.html it should be ONLY .xlsx

Here you have my headers:

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

So what I'm doing wrong?

解决方案

I've not had this function fail yet -- it works with all the Office 2007/2010 files that I've tried so far in Safari (Windows) and Chrome. The get_known_mime_types() function just returns a giant array of all the mime-types that my app supports -- just Google for the MIME types you need. $file is the actual path to the file on your host, and $name is the file name that displays in the download (run/save) dialog. I've also given due credit to the place I got most of it from. Hope you have luck with it too:

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();
}

这篇关于Webkit和Excel文件(PHPexcel)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆