PHP下载Excel文件变得腐败

我有一个Excel文件,我想用户能够从我的服务器下载。 我在这里看了很多问题,但我找不到正确下载文件W / O损坏的方法。 我假设这是头,但我还没有他们的工作组合。 这就是我现在和在我收到的腐败文件,我可以看到我想要的电子表格的列名称,但它的一切搞砸了。

$filename = '/var/www/web1/web/public/temporary/Spreadsheet.xls'; header("Content-type: application/octet-stream"); header("Content-type: application/vnd-ms-excel"); header("Content-Disposition: attachment; filename=ExcelFile.xls;"); header("Pragma: no-cache"); header("Expires: 0"); readfile($filename); 

编辑:解决scheme我忘了补充说,我正在使用Zend,它试图使用本机PHP方法时,正在破坏文件。 我的finsihed代码是放置一个链接到我的控制器中的另一个动作,并从那里下载文件

 public function downloadAction(){ $file = '/var/www/web1/web/public/temporary/Spreadsheet.xls'; header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="Spreadsheet.xls"'); readfile($file); // disable the view ... and perhaps the layout $this->view->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); } 

尝试这样做

  ob_get_clean(); echo file_get_contents($filename); ob_end_flush(); 

首先,只指定一次Content-Type 。 你可以使用excel特定的头文件,但是通用的application/octet-stream可能是一个更安全的select,只是为了让它工作(真正的区别将是浏览器显示用户关于“你想打开这个文件与“,但基本的浏览器也可以依靠扩展)

另外,请确保指定Content-Length并转储您要输出的文件的大小(以字节为单位)。 浏览器需要知道文件有多大,希望接收多less内容(所以不会中途停止,或者打嗝不会中断文件下载)。

所以,整个文件应该包括:

 <?php $filename = '/var/www/web1/web/public/temporary/Spreadsheet.xls'; header("Content-Disposition: attachment; filename=ExcelFile.xls;"); header('Content-Type: application/octet-stream'); header('Content-Length: ' . filesize($filename)); header("Pragma: no-cache"); header("Expires: 0"); @readfile($filename); 
 $file_name = "file.xlsx"; // first, get MIME information from the file $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $file_name); finfo_close($finfo); // send header information to browser header('Content-Type: '.$mime); header('Content-Disposition: attachment; filename="download_file_name.xlsx"'); header('Content-Length: ' . filesize($file_name)); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); //stream file ob_get_clean(); echo file_get_contents($file_name); ob_end_flush();