xlsx文件在php中下载时已损坏

xlsx文件在php中下载时已损坏,php,excel,zend-framework,Php,Excel,Zend Framework,我需要下载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

我需要下载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; ?>
查看:

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

只是要确保这既不是头问题,也不是filesire问题

unzip -l your-file.xlsx 
通常使用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应该可以做到这一点


希望对你有帮助。

我发现了问题。我剪切和粘贴在单独的控制器,只有下载代码的代码。在那个时候它起作用了

这是由于init函数(映射所需的控制器和模型文件)中发生错误而导致的。对每个文件进行注释并检查,发现一个文件中存在错误

希望这个答案能帮助别人


感谢您的评论。

尝试从属性中解锁。尝试将缓冲区大小增加到4096I我对文件拥有完全权限(读/写和执行)-rwxrwxrwx@liswectec增加缓冲区大小。这也不起作用Excel的确切错误消息是什么?您正在下载的文件是一个实际的xlsx文件,还是其他假装是Excel文件的文件?我在文件中添加了头并向下加载,但仍然不起作用。我执行解压命令,它不会显示任何警告。十六进制查看器命令将输出显示为0000000:50 4b 03 04 14 PK。。。