xlsx文件在php下载时已损坏

时间:2016-08-19 04:30:13

标签: php excel zend-framework

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

控制器:

$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 /任何图像文件)。

2 个答案:

答案 0 :(得分:0)

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

要做的第一件事可能就是像这样设置标题:

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

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

只是为了确保这既不是标题也不是文件问题。

通常使用xlsx文件,您将在文件的开头有一个BOM。 有一种非常简单的方法可以测试使用解压缩是否存在问题。 尝试解压缩你的xlsx文件,如果你有这样的东西,那么这就是导致问题的BOM。

unzip -l your-file.xlsx 

你应该看到

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

您还可以使用十六进制查看器

进行检查
head -c5 your-file.xlsx | xxd -g 1

如果你有这样的输出:

 0000000: ef bb bf 50 4b 

然后是BOM问题(注意3个第一个字节ef bb bf)。

删除bom(因特网上有很多解决方案),或者将文件编码为UTF-8应该可以解决问题。

希望它有所帮助。

答案 1 :(得分:0)

我发现了问题。我将代码剪切并粘贴到仅具有下载代码的单独控制器中。在那个时候它起作用。

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

希望这个答案可以帮助某人

感谢您的评论。