Webkit and Excel file(PHPexcel)

前端 未结 1 1065
再見小時候
再見小時候 2021-01-07 11:58

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 .

相关标签:
1条回答
  • 2021-01-07 12:20

    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();
    }
    
    0 讨论(0)
提交回复
热议问题