xlsx 文件在 php 下载时损坏
xlsx File is corrupted on download in php
我需要在 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/any 图像文件)。
有多种问题可能会导致此错误。
首先要做的可能是像这样设置 header:
header('Content-Length: ' . filesize('./uploads/resources/courses/' . $filename));
和
header('Content-Transfer-Encoding: binary');
只是为了确定这既不是 header 也不是文件源问题。
对于 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 应该可以解决问题。
希望对你有所帮助。
我发现了问题。我将代码剪切并粘贴到仅具有下载代码的单独控制器中。在那个时候它起作用了。
这是因为初始化函数(映射需要的控制器和模型文件)发生错误引起的。对每个文件进行注释,检查发现有一个文件有错误。
希望这个回答能对某人有所帮助
感谢您的评论。
我需要在 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/any 图像文件)。
有多种问题可能会导致此错误。
首先要做的可能是像这样设置 header:
header('Content-Length: ' . filesize('./uploads/resources/courses/' . $filename));
和
header('Content-Transfer-Encoding: binary');
只是为了确定这既不是 header 也不是文件源问题。
对于 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 应该可以解决问题。
希望对你有所帮助。
我发现了问题。我将代码剪切并粘贴到仅具有下载代码的单独控制器中。在那个时候它起作用了。
这是因为初始化函数(映射需要的控制器和模型文件)发生错误引起的。对每个文件进行注释,检查发现有一个文件有错误。
希望这个回答能对某人有所帮助
感谢您的评论。