xlsx文件在下载中损坏

我需要在php下载xlsx文件。 该文件正在下载,但是当我打开它显示为损坏的文件。 我使用zend框架

控制器:

$fullPath = '/opt/bitnami/lampstack-5.4.36-0/apps/projects/ProjectName/File_Name.xlsx'; if ($fd = fopen ($fullPath, "r")) { $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); $ext = strtolower($path_parts["extension"]); header("Content-type: application/xlsx"); header("Content-Disposition: attachment;filename=\"".$path_parts["basename"]."\""); header("Content-length: $fsize"); header("Cache-control: private"); while(!feof($fd)) { $buffer = fread($fd, 2048); echo $buffer;//To display the file content while downloaded. } } fclose ($fd); 

视图:

 <?php echo $this->buffer; ?> 

除了xlsx / xls文件正在正确下载(PDF /任何图像文件)。

有多个问题比可能发生并导致此错误。

首先要做的就是像这样设置标题:

header('Content-Length: ' . filesize('./uploads/resources/courses/' . $filename));

 header('Content-Transfer-Encoding: binary'); 

只是为了确定这既不是一个标题,也不是一个文件问题。

通常使用xlsx文件,您将在文件开始时拥有一个BOM。 有一个非常简单的方法来testing是否使用解压缩的问题。 尝试解压缩你的xlsx文件,如果你有这样的事情,那么这是导致问题的BOM。

 unzip -l your-file.xlsx 

你应该看看

 warning file: 3 extra bytes at beginning or within zipfile. 

您也可以使用hex查看器进行检查

 head -c5 your-file.xlsx | xxd -g 1 

如果你有这样的输出:

  0000000: ef bb bf 50 4b 

那么这是一个BOM问题(注意3个第一个字节ef bb bf )。

删除bom(因特网是完整的解决scheme),或者将文件编码为UTF-8应该可以做到。

希望它帮助你。

我发现了这个问题。 我只将代码粘贴到具有下载代码的单独控制器中。 在那个时候它工作。

这是由于在init函数(映射需要的控制器和模型文件)中发生错误而引起的。 评论每个文件,并检查并find一个文件中的错误。

希望这个答案会帮助别人

谢谢你的评论。